列表理解和函数
当我尝试这样的事情时,我有点困惑
b = [lambda x:x**i for i in range(11)]
当我尝试 b[1](2)
时,我得到 1024 作为错误的结果。但是当我这样写时,
b = [(lambda i: lambda x:x**i)(i) for i in range(11)]
一切正常
>>> b[1](2)
2
>>> b[5](2)
32
它工作正常,但是第一个代码出了什么问题?
I'm a little confusing when try something like this
b = [lambda x:x**i for i in range(11)]
When I then try b[1](2)
I have 1024 as a result that is wrong. But when I write so
b = [(lambda i: lambda x:x**i)(i) for i in range(11)]
all is OK
>>> b[1](2)
2
>>> b[5](2)
32
It works fine but what's wrong in first code?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是由于 Python 中闭包的工作原理。
循环更改所有函数共享的范围内的值。将函数的生成移至单独的作用域,即函数。
This is due to how closures in Python work.
The loop changes the value in the scope that all the functions share. Move generation of the function into a separate scope, i.e. function.
这是一场范围游戏。
在第一个代码中,lambda 中的“i”名称只是一个引用。当 for 循环执行时,该引用后面的值会发生变化。
在第二个代码中,有两个不同的范围。
It's a game of scopes.
In the first code, the "i" name in the lambda is only a reference. The value behind that reference gets altered as the for loop executes.
In the second code, there are two different scopes.