2024-06-02 06:16:32 发布
网友
如果我列出两个函数列表:
def makeFun(i): return lambda: i a = [makeFun(i) for i in range(10)] b = [lambda: i for i in range(10)]
为什么列表a和b的行为不符合保存方式?
a
b
例如:
>>> a[2]() 2 >>> b[2]() 9
技术上,lambda表达式是在全局范围内可见的i上的closed,最后一次设置为9。这是所有10个lambda中所指的相同的i。例如
i
i = 13 print b[3]()
在makeFun函数中,lambda在调用函数时定义的i上关闭。它们是十种不同的
makeFun
一组函数(a)对传递的参数执行操作,另一组(b)对全局变量执行操作,然后将其设置为9。检查拆卸:
>>> import dis >>> dis.dis(a[2]) 1 0 LOAD_DEREF 0 (i) 3 RETURN_VALUE >>> dis.dis(b[2]) 1 0 LOAD_GLOBAL 0 (i) 3 RETURN_VALUE >>>
正如其他人所说,范围界定是问题所在。请注意,可以通过向lambda表达式添加额外的参数并为其指定默认值来解决此问题:
>> def makeFun(i): return lambda: i ... >>> a = [makeFun(i) for i in range(10)] >>> b = [lambda: i for i in range(10)] >>> c = [lambda i=i: i for i in range(10)] # <-- Observe the use of i=i >>> a[2](), b[2](), c[2]() (2, 9, 2)
结果是i现在显式地放在lambda表达式的范围内。
lambda
技术上,lambda表达式是在全局范围内可见的
i
上的closed,最后一次设置为9。这是所有10个lambda中所指的相同的i
。例如在
makeFun
函数中,lambda在调用函数时定义的i
上关闭。它们是十种不同的一组函数(a)对传递的参数执行操作,另一组(b)对全局变量执行操作,然后将其设置为9。检查拆卸:
正如其他人所说,范围界定是问题所在。请注意,可以通过向lambda表达式添加额外的参数并为其指定默认值来解决此问题:
结果是
i
现在显式地放在lambda
表达式的范围内。相关问题 更多 >
编程相关推荐