加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 为什么这两个’x’引用不同的变量?

发布时间:2020-12-20 12:29:07 所属栏目:Python 来源:网络整理
导读:在此代码中,lambda中的x指的是for语句中的x.所以y [0]()返回2: x = 0y = [lambda : x for x in range(3)]y[0]() 但是在这段代码中,lambda中的x指的是全局x,所以x [0]()返回全局x本身: x = [lambda : x for x in range(3)]x[0]() 我想知道为什么lambda中的x
在此代码中,lambda中的x指的是for语句中的x.所以y [0]()返回2:

x = 0
y = [lambda : x for x in range(3)]
y[0]()

但是在这段代码中,lambda中的x指的是全局x,所以x [0]()返回全局x本身:

x = [lambda : x for x in range(3)]
x[0]()

我想知道为什么lambda中的x指的是第一段代码中的局部x,而第二段代码中的全局x.

解决方法

x指的是两段代码中的全局x.实际上,在两段代码中只有全局x.这里没有局部变量,只有全局变量.

在第一个示例中,x的全局值为2,因为这是列表推导分配给它的最后一个值.列表推导将其变量泄漏到封闭范围内,如@wim所述.由于此处的封闭范围是全局范围,因此变量x将泄漏到全局范围,覆盖您之前设置的值0.

在第二个示例中,您创建列表推导,但随后将其值分配给(全局)变量x.这会覆盖x中已有的内容,因此全局变量x的值现在是列表.

在这两种情况下,当您调用列表中的一个函数(任何一个!)时,它将返回x的当前值.你可以在这里看到:

>>> y = [lambda : x for x in range(3)]
>>> y[0]()
2
>>> x = 88
>>> y[0]()
88
>>> x = [lambda : x for x in range(3)]
>>> y = x
>>> y[0]()
[<function <lambda> at 0x017789B0>,<function <lambda> at 0x01828DB0>,<function <lambda> at 0x01828F30>]
>>> x = 88
>>> y[0]()
88

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读