Странное поведение LIST как параметра в рекурсивной функции - PullRequest
0 голосов
/ 24 июня 2019

Почему приведенный ниже код дает такой вывод?Я ожидал другой вывод

код:

def run(n,IC):
    n+=1
    print(n,IC)
    if n==4:
        return n
    IC.append(n)
    run(n,IC)
    print("reached here",n,IC)
run(0,[])

он дает вывод:

1 []
2 [1]
3 [1, 2]
4 [1, 2, 3]
reached here 3 [1, 2, 3]
reached here 2 [1, 2, 3]
reached here 1 [1, 2, 3]

но я ожидал:

2 [1]
3 [1, 2]
4 [1, 2, 3]
reached here 3 [1, 2, 3]
reached here 2 [1, 2]
reached here 1 [1]

Ответы [ 4 ]

0 голосов
/ 24 июня 2019

Списки остаются внутри и снаружи функций

Как только вы добрались до этой строки "4 [1, 2, 3]" ваш список IC теперь равен [1, 2, 3], и это будет оставаться верным для остальной части кода, так как вы не применили никаких изменений к списку (все, что вы сделали, это напечатали «достигнуто») после), он остался прежним

ИДК, если будет ясно ^^

0 голосов
/ 24 июня 2019

Самый первый оператор печати, n - это 1, но вы ничего не добавили к IC.Следовательно, IC равно [].Кроме того, IC является списком и, следовательно, ссылочным типом, поэтому один и тот же IC используется во всех вызовах функций.

0 голосов
/ 24 июня 2019

Первая дополнительная строка в выводе есть, потому что у вас есть печать перед добавлением. Когда вы даете список только с именем переменной, вы фактически даете адрес этому списку. Поэтому, когда вы используете список с одинаковым именем во всех функциях, вы всегда получаете доступ к одному и тому же списку

Надеюсь, это поможет

0 голосов
/ 24 июня 2019

он в основном передается как ссылка, а не по значению

def run(n,IC):
  n+=1
  print(n,IC)
  if n==4:
      return n
  IC.append(n)
  run(n,IC)
  print("reached here",n,IC)
  IC.pop()
run(0,[])

, вам нужно добавить IC.pop () для достижения вашего решения

и 1,[] добавлено, потому что вы начали выполнение с n как 0 и IC как []

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...