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

Deep copy index integer using 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 使用变量的动态名称解析,即 [=13 的值=] 在执行函数时(而不是在声明函数时)使用。

如果你真的需要一个函数来打印值那么你需要创建一个闭包,这意味着在另一个函数中创建函数,例如:

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