列表理解和函数

发布于 2024-08-21 00:47:40 字数 346 浏览 4 评论 0原文

当我尝试这样的事情时,我有点困惑

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

耳根太软 2024-08-28 00:47:40

这是由于 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.

破晓 2024-08-28 00:47:40

这是一场范围游戏。

在第一个代码中,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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文