Python 2.7 在执行列表理解时修改变量实例

Python 2.7 在执行列表理解时修改变量实例,python-2.7,Python 2.7,列表理解不应该限制变量范围吗 user = <user1> project.users = [<user1>, <user2>, <user3>, <user4>] project_usernames = [user.username for user in project.users] 用户= project.users=[,] project\u usernames=[user.username代表project.users中的

列表理解不应该限制变量范围吗

user = <user1>
project.users = [<user1>, <user2>, <user3>, <user4>]
project_usernames  = [user.username for user in project.users]
用户=
project.users=[,]
project\u usernames=[user.username代表project.users中的用户]
我正在使用project.users上的列表理解生成列表project\u用户名。 但它正在将用户修改为先前的

我在我的一个项目中使用了上面的流程,但由于这个bug,它无法工作

后来,当我在列表理解中更改变量“user”时,它工作正常

中的实体指的是


我知道解释器是逐行工作的,但是列表理解中使用的变量的作用域不应该在迭代结束后消失吗?

这是Python2.x的一个“特性”,您在列表理解中使用的变量(在您的例子中,
user
)成为周围作用域的一部分(在Python3中,它被视为一个生成器—请参阅Guido自己的分解)。假设您正在迭代列表(而不是需要在内存中拥有所有可用的内容),您可以将其设置为一个生成器,只需将括号更改为圆括号:

>>> user = 'test'
>>> l = ['user1', 'user2', 'user3']
>>> users = (user[4] for user in l)
>>> users
<generator object <genexpr> at 0x7f6a89507140>
>>> user
'test'
>>> for num in users:
...   print num
...
1
2
3
>用户='test'
>>>l=['user1','user2','user3']
>>>用户=(用户[4]表示l中的用户)
>>>使用者
>>>使用者
“测试”
>>>对于用户中的num:
…打印数
...
1.
2.
3.

这是Python2.x的一个“特性”,在这里,您在列表理解中使用的变量(在您的例子中,
user
)成为周围范围的一部分(在Python3中,它被视为生成器-请参阅Guido自己的分解)(与需要在内存中存储所有可用内容不同),您可以将其设置为生成器,只需将括号更改为括号:

>>> user = 'test'
>>> l = ['user1', 'user2', 'user3']
>>> users = (user[4] for user in l)
>>> users
<generator object <genexpr> at 0x7f6a89507140>
>>> user
'test'
>>> for num in users:
...   print num
...
1
2
3
>用户='test'
>>>l=['user1','user2','user3']
>>>用户=(用户[4]表示l中的用户)
>>>使用者
>>>使用者
“测试”
>>>对于用户中的num:
…打印数
...
1.
2.
3.