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 一个新对象,在本例中是一个字典。所以每次迭代都是在一个新的字典上。
一个例子会更好地理解这一点。
调用 generator
的 next
方法生成每个元素。
>>> 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]
所以列表理解和字典理解是相似的,这导致实际数据不像产生元素的生成器。
那么下面例子中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 一个新对象,在本例中是一个字典。所以每次迭代都是在一个新的字典上。
一个例子会更好地理解这一点。
调用 generator
的 next
方法生成每个元素。
>>> 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]
所以列表理解和字典理解是相似的,这导致实际数据不像产生元素的生成器。