使用 lambda 的深度复制索引整数


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()

最新更新