在进行列表理解时修改变量实例

时间:2012-10-11 11:30:09

标签: python-2.7

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

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

我使用project.users上的list comprehension生成list_usernames列表。 但它正在将用户修改为<user4>之前的<user1>

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

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

<>内的实体是指<object>

我知道解释器逐行工作,但是一旦迭代结束,列表解析中使用的变量范围是否应该消失?

1 个答案:

答案 0 :(得分:1)

这是一个Python 2.x'功能',你在列表推导中使用的变量(在你的情况下,user)成为周围范围的一部分(在Python 3中,它被视为生成器 - 请参阅here以了解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