Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python lambda的变量捕获行为_Python_Lambda - Fatal编程技术网

Python lambda的变量捕获行为

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

考虑以下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(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))