gpt4 book ai didi

python - 生成器理解与列表理解不同的输出?

转载 作者:IT老高 更新时间:2023-10-28 22:17:21 25 4
gpt4 key购买 nike

当使用列表推导和生成器推导时,我得到不同的输出。这是预期的行为还是错误?

考虑以下设置:

all_configs = [
{'a': 1, 'b':3},
{'a': 2, 'b':2}
]
unique_keys = ['a','b']

如果我然后运行以下代码,我会得到:

print(list(zip(*( [c[k] for k in unique_keys] for c in all_configs))))
>>> [(1, 2), (3, 2)]
# note the ( vs [
print(list(zip(*( (c[k] for k in unique_keys) for c in all_configs))))
>>> [(2, 2), (2, 2)]

这是在 python 3.6.0 上:

Python 3.6.0 (default, Dec 24 2016, 08:01:42)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin

最佳答案

在列表推导中,表达式被急切地求值。在生成器表达式中,仅根据需要查找它们。

因此,当生成器表达式迭代 for c in all_configs 时,它引用了 c[k] 但只在之后查找 c循环完成,所以它只使用两个元组的最新值。相比之下,列表推导会立即计算,因此它会创建一个第一个值为 c 的元组和另一个第二个值为 c 的元组。

考虑这个小例子:

>>> r = range(3)
>>> i = 0
>>> a = [i for _ in r]
>>> b = (i for _ in r)
>>> i = 3
>>> print(*a)
0 0 0
>>> print(*b)
3 3 3

在创建 a 时,解释器会立即创建该列表,并在评估后立即查找 i 的值。在创建 b 时,解释器只是设置了那个生成器,并没有真正迭代它并查找 i 的值。 print 调用告诉解释器评估这些对象。 a 已经作为一个完整的列表存在于内存中,旧值是 i,但是 b 在那个时候被求值,当它查找时i的值,它找到了新的值。

关于python - 生成器理解与列表理解不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42805800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com