1

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

user = <user1>
project.users = [<user1>, <user2>, <user3>, <user4>]
project_usernames  = [user.username for user in project.users]

我正在使用 project.users 上的列表理解生成列表 project_usernames。但它正在修改<user4>之前的用户<user1>

我在我的一个项目中使用了上述流程,但由于这个错误,它无法正常工作。

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

内的实体<>是指<object>

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

4

1 回答 1

1

这是 Python 2.x 的“功能”,您在列表推导中使用的变量(在您的情况下为user)成为周围范围的一部分(在 Python 3 中,它被视为生成器 - 请参阅此处了解详细信息来自圭多本人)。假设您正在遍历您的列表(而不是需要将所有内容都放在内存中),您可以通过将括号更改为圆括号来像生成器一样设置它:

>>> 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
于 2012-10-12T01:01:49.933 回答