Почему python не возвращает ссылку?

У меня есть вопрос о том, как Python возвращает значение. Ниже приведен мой простой код на Python, реализующий рекурсивную функцию.

def brackets(ans, n, cur, open, close):
    if len(cur) == n*2:
        ans.append(cur)   # <---l.1
        return ans        # <---l.2   

    if open < n:
        brackets(ans, n,cur+"(",open+1,close)

    if open > close:
        brackets(ans, n,cur+")",open,close+1)

ans = []
ret = brackets(ans, 2, "", 0,0)  # <---l.3
print(ans)
print(ret)

===== 
return:
['(())', '()()']
None

Я думаю, что изменяю объект списка ans в строке l.1 и возвращаю его, а в строке l.2 я передаю ссылку ans в строке l.3. Но когда я печатаю оба значения ans и ret, ret не содержит того же значения, что и ans.

Конечно, я просто вывожу ans для правильного ответа, но я ожидал, что Python инициализирует переменную ret и присвоит brackets ссылку возврата на ret в строке l.3.

Я запутался, как python передает ссылку через функцию. Пожалуйста, дайте мне знать соответствующие документы или ответ.


person JSKIM    schedule 09.03.2020    source источник


Ответы (2)


Если длина cur не равна n*2, функция brackets() не возвращает никакого значения. Честно говоря, нелегко понять, что он должен вернуть, потому что вы не опубликовали некоторые ожидаемые результаты. Тем не менее, вот несколько вариантов:

  1. Всегда возвращайте значение рекурсивного вызова:

     if open < n:
         return brackets(ans, n,cur+"(",open+1,close)
    
     if open > close:
         return brackets(ans, n,cur+")",open,close+1)
    

    В этом случае это будет конечный результат:

     ['(())']
     ['(())']
    

    or

  2. Возвратите ans в конце функции:

     return ans
    

    Это будет вывод:

     ['(())', '()()']
     ['(())', '()()']
    
person brandizzi    schedule 09.03.2020

Это связано с переменной областью действия. Переменная внутри функции brackets отличается от переменной вне функции, даже если они имеют одинаковое имя (ans). Вот статья, которая может помочь вам в этом.

person megargayu    schedule 09.03.2020