只需更改评估顺序即可
props = set([k for k in u.properties().keys() for u in users])
至
props = set([k for u in users for k in u.properties().keys() ])
你也不需要列表理解,但是具有集合理解的生成器表达式可以在这里工作
props = set(k for u in users for k in u.properties().keys() )
评估顺序是从右到左
在你的原始表达中
set([k for k in u.properties().keys() for u in users])
可以打破
for k in u.properties().keys(): # Here u is undefined
for u in users:
#what ever
使用Dummy表达式的有趣现象是List Comprehension Leaks Variables导致你在全局范围内泄露的事实
所以
[u.properties().keys() for u in users]
在全球范围内泄漏,
这使得
set([k for k in u.properties().keys() for u in users])
合法
以下示例显示了列表推导如何泄漏变量
>>> del i
>>> foo = [range(1,10) for _ in range(10)]
>>> globals()['i']
Traceback (most recent call last):
File "", line 1, in
globals()['i']
KeyError: 'i'
>>> [i for i in foo]
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, 7, 8, 9]]
>>> globals()['i']
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>