Skip to main content
 首页 » 编程设计

python之评估 python 中的列表理解

2025年05月04日12dflying

在尝试使用列表理解来制作给定条件的列表时,我看到以下内容:

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'} 

请注意,生成器在几个重要方面不同于列表。也许最值得注意的是,一旦您对它们进行迭代,它们就会耗尽,因此如果您只需要它们包含一次的数据,最好使用它们。