func = []
for value in range(5):
func.append(lambda: print_index(value))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
当我运行上面的代码时,输出是
4
4
4
4
4
为什么不是?
0
1
2
3
4
我能做些什么来使它像上面一样。
我尝试导入副本并使用copy.deepcopy(index)
.我没有工作,可能是因为索引是一个整数。
lambda
是它不起作用的部分原因。
感谢您的帮助!
不太确定您要实现的目标,但它打印所有4
的原因是因为 Python 使用变量的动态名称解析,即执行函数时(而不是声明时(的value
值。
如果你真的需要一个函数来打印值,那么你需要创建一个闭包,这意味着在另一个函数中创建函数,例如:
def make_closure(v):
return lambda: print_index(v)
func = []
for value in range(5):
func.append(make_closure(value))
现在输出:
In []:
for a in func:
a()
Out[]:
0
1
2
3
4
正如@AChampion所说,Python 在需要时计算value
的值,而不是在执行循环时
计算。但是对我来说,执行以下修复似乎更容易。
func = []
for value in range(5):
func.append(lambda v = value: print_index(v))
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()
这是在循环执行期间计算的函数中设置默认参数。上面的代码等于说:
func = []
for value in range(5):
def anonymous_function(v=value):
print_index(v)
func.append(anonymous_function)
def print_index(index_to_print):
print(index_to_print)
for a in func:
a()