list() 和 dict() 与生成器之间的区别

Difference between list() and dict() with generators

那么下面例子中list()dict()之间的区别背后的解释是什么:

glist = (x for x in (1, 2, 3))
print(list(glist))
print(list(glist))

gdict = {x:y for x,y in ((1,11), (2,22), (3,33))}
print(dict(gdict))
print(dict(gdict))

>>>
[1, 2, 3]
[]
{1: 11, 2: 22, 3: 33}
{1: 11, 2: 22, 3: 33}

区别在于只有第一个表达式glist是一个生成器,第二个gdict是一个dict-comprehension。只有当您将第一个更改为 [x for x in (1, 2, 3)].

时,这两个才等效

立即评估理解。

这些是完全不同的东西。第一个表达式是一个生成器:在第一次迭代后,它已经耗尽,所以进一步的迭代是空的。

第二个是字典理解:就像列表理解一样,它每次 returns 一个新对象,在本例中是一个字典。所以每次迭代都是在一个新的字典上。

一个例子会更好地理解这一点。

调用 generatornext 方法生成每个元素。

>>> a = (i for i in range(4))
>>> a.next()
0
>>> a.next()
1
>>> a.next()
2
>>> a.next()
3
>>> a.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> list(a)
[]

现在在我们的生成器对象上调用 list 函数。

>>> a = (i for i in range(4))
>>> list(a)
[0, 1, 2, 3]
>>> list(a)
[]

现在对我们的列表理解调用 list

>>> a = [i for i in range(4)]
>>> list(a)
[0, 1, 2, 3]
>>> list(a)
[0, 1, 2, 3]

所以列表理解和字典理解是相似的,这导致实际数据不像产生元素的生成器。