列表理解不应该限制变量范围。
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>
我知道解释器逐行工作,但是一旦迭代结束,列表解析中使用的变量范围是否应该消失?
答案 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