关于python:list()和dict()与生成器之间的区别

Difference between list() and dict() with generators

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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理解。只有当你把第一个改为[x for x in (1, 2, 3)]时,这两个数字才是相等的。

立即评估理解力。


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

第二个是听写理解:和列表理解一样,它每次都返回一个新对象,在本例中是听写,所以每次迭代都在新听写之上。


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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函数。

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

现在打电话给我们名单上的list

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

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