2012-10-11 47 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