2012-10-11 52 views
1

列表理解不应该限制变量范围。在列表理解的同时修改变量实例

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

我在project.users上使用list comprehension生成列表project_usernames。 但它将用户更改为<user4>,此前是<user1>

我在我的一个项目中使用上面的流程,但由于这个错误,它不工作。

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

<>实体是指<object>

我知道,解释由线工作线,但不应变量的列表理解使用范围死一次迭代结束?

回答

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