为啥列表推导会影响外部变量的值? [复制]

Posted

技术标签:

【中文标题】为啥列表推导会影响外部变量的值? [复制]【英文标题】:Why list comprehension can affect the value of an outer variable? [duplicate]为什么列表推导会影响外部变量的值? [复制] 【发布时间】:2019-12-25 15:18:46 【问题描述】:

如果您使用 Python 2.7 运行此代码,

i = 5
x = [1, 2, 3, 4]
y = [i*i for i in x if i % 2 == 0]

i 的值变成了 4。但是怎么做呢?

【问题讨论】:

python 3 还是 python 2? python 3 的值等于 5。 如果您使用 python 2,请在循环中使用另一个变量名。 我当然可以使用另一个变量,但我只是问为什么会导致这种情况。 【参考方案1】:

我认为您使用的是 Python 2.7,它会泄漏理解中定义的变量。在最后一次迭代中,循环中的 i 等于 4,一旦控制离开了理解,理解中的名称 i 就会隐藏全局名称。

不过,Python 3 不再这样做了,因此您应该更新。

【讨论】:

【参考方案2】:

这是 Python 2 的特定限制。列表推导式中的变量在 Python 3 中有自己的作用域:

Python 3.7.2 (default, Mar 11 2019, 11:54:40) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> i = 5
>>> x = [1, 2, 3, 4]
>>> y = [i*i for i in x if i == 2]
>>> i
5

【讨论】:

以上是关于为啥列表推导会影响外部变量的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python2中的列表推导式存在变量泄漏问题,在Python3中不存在

python学习笔记函数return多个值,列表推导式和交换两个变量的值

为啥插入方法会影响两个列表? [复制]

python 为啥我修改列表一个元素会导致所有元素都被修改

为啥不能比较两个 int 类型变量的值? [复制]

为啥操作完成后可以访问列表理解变量? [复制]