Я достаточно опытный программист на C/C++ (и в некоторой степени на Java). Я изучаю python, но я сбит с толку некоторыми странными (для моего фона) поведением языка.
Я изучаю вложенные функции и замыкания (читая «Изучение Python», это кажется мне действительно хорошим источником).
Я понимаю, что если я вложу определение в цикл for, когда я вызову созданную функцию, она ищет последнее значение захваченной переменной цикла (поскольку она захватывает по ссылке, как сказал бы программист C++)
funcs = []
for i in range(4):
def f():
print(i)
funcs.append(f)
и запустив программу, результат
>>> for f in funcs:
f()
3
3
3
3
Теперь, я обдумывал это, когда наткнулся на это (как мне кажется) несоответствие: если я делаю
for i in range(4):
funcs[i]()
0
1
2
3
больше сбивает с толку, если я
>>> i = 2
>>> funcs[i]()
2
и теперь все функции в списке возвращают 2:
for f in funcs:
f()
2
2
2
2
должен быть какой-то вопрос, связанный с объемом, который я не могу понять
funcs.append(f)
. Я мог бы быть не в духе здесь, ноprint(i)
напечатает последнее сгенерированноеi
. В вашем случае этоfor i in range(4):
, а не когда вы определили функцию. Так что не странно, что вы получаете этот вывод. Таким образом,i
не замораживается при создании функции, а является живым значением. Вы печатаете последнее известное/установленное значениеi
. - person Torxed   schedule 21.01.2019print(i)
не будет печататьi
изdef f()
-цикла, аfor i in range(4): funcs[i]()
-цикла. Смотрите мой комментарий выше. - person Torxed   schedule 21.01.2019