Python lambda的变量捕获行为
考虑以下Python代码片段:Python lambda的变量捕获行为,python,lambda,Python,Lambda,考虑以下Python代码片段: fns = [] for i in range(2): x = i fns.append(lambda: x) for fn in fns: print(fn()) 为什么要打印 1 1 而不是 0 1 lambda函数正在打印变量x的值: fns = [] for i in range(2): x = i fns.append(lambda: x) x = 4 for fn in fns: print(f
fns = []
for i in range(2):
x = i
fns.append(lambda: x)
for fn in fns:
print(fn())
为什么要打印
1
1
而不是
0
1
lambda函数正在打印变量
x
的值:
fns = []
for i in range(2):
x = i
fns.append(lambda: x)
x = 4
for fn in fns:
print(fn())
#4
#4
lambda函数正在打印变量
x
的值:
fns = []
for i in range(2):
x = i
fns.append(lambda: x)
x = 4
for fn in fns:
print(fn())
#4
#4
Python使用后期绑定和词法作用域
i
是一个自由变量,在您创建的匿名函数上关闭。它总是指全局范围内的i
。注意,在for循环之后打印(i)
。“正确”的方法是使用另一个封闭范围:.append((lambda x:lambda:x)(i))
。还有一个技巧,涉及使用默认参数:.append(lambda i=i:i)
。这并不是完全等效的,因为现在匿名函数有了一个默认参数,但它可以工作,因为默认参数在函数定义时只计算一次,所以对于范围(2)中的i:fns.append((lambda x:lambda:x)(i))Python使用后期绑定和词法作用域i
是一个自由变量,在您创建的匿名函数上关闭。它总是指全局范围内的i
。注意,在for循环之后打印(i)
。“正确”的方法是使用另一个封闭范围:.append((lambda x:lambda:x)(i))
。还有一个技巧,涉及使用默认参数:.append(lambda i=i:i)
。这并不是完全等效的,因为现在匿名函数有了一个默认参数,但它可以工作,因为默认参数在函数定义时只计算一次,所以对于范围(2)中的i:fns.append((lambda x:lambda:x)(i))