在尝试使用列表理解来制作给定条件的列表时,我看到以下内容:
In [1]: mydicts = [{'foo':'val1'},{'foo':''}]
In [2]: mylist = [d for d in mydicts if d['foo']]
In [3]: mylist
Out[3]: [{'foo': 'val1'}]
In [4]: mydicts[1]['foo'] = 'val2'
In [5]: mydicts
Out[5]: [{'foo': 'val1'}, {'foo': 'val2'}]
In [6]: mylist
Out[6]: [{'foo': 'val1'}]
我一直在阅读文档以尝试理解这一点,但到目前为止一无所获,所以我会在这里问我的问题:为什么 mylist 从不包含 {'foo': 'val2'} 即使列表理解中的引用指向 mydict,它由 In [6] 包含 { 'foo': 'val2'}?这是因为 Python 热切地评估列表理解吗?还是懒惰/急切的二分法与此完全无关?
请您参考如下方法:
Python 中没有列表的惰性求值。列表理解只是创建一个新列表。如果您想要“惰性”评估,请使用 generator expression相反。
my_generator_expression = (d for d in mydicts if d['foo']) # note parentheses
mydicts[1]['foo'] = 'val2'
print(my_generator_expression) # >>> <generator object <genexpr> at 0x00000000>
for d in my_generator_expression:
print(d) # >>> {'foo': 'val1'}
# >>> {'foo': 'val2'}
请注意,生成器在几个重要方面不同于列表。也许最值得注意的是,一旦您对它们进行迭代,它们就会耗尽,因此如果您只需要它们包含一次的数据,最好使用它们。
