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

Код является:

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]
0
vkswhy 24 Июн 2019 в 16:15

4 ответа

Лучший ответ

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

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 как []

0
Shanmukh 24 Июн 2019 в 13:28

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

0
Tobias Feil 24 Июн 2019 в 13:21

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

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

0
Robot Mind 24 Июн 2019 в 13:21

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

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

ИДК, если это ясно ^^

0
Benoit F 24 Июн 2019 в 13:25