用自己的生成器替换变量

时间:2016-03-03 21:35:04

标签: python generator

也许这是一个愚蠢的问题,但我想知道为什么这实际上有效:

a = {'a': 1, 'b': 2}
a = a.items() # or .iteritems() on python2 # or even a = (i for i in a)

b = [i for i in a]
b
[('b', 2), ('a', 1)]

为什么我可以用变量上的生成器替换变量?这不删除原始字典的实际内容吗?为什么它仍然知道该变量中的内容?

因为尝试

a['a'] # before creating b 

会产生TypeError,因为

  

'dict_items'对象不可订阅

2 个答案:

答案 0 :(得分:2)

这是因为在评估表达式之前未分配a.items()。也就是说,a被评估为生成器,然后a被分配给它。由于a不再引用字典,因此未更改生成器。字典仍然存在;它不再被称为{{1}}。

答案 1 :(得分:0)

如果你这样做

type(a) #before creating b 

你会得到

=> <class 'dict_items'>

请记住a.items()会返回一个副本。来自documentation

dict.items(): Return a view object of the dictionary’s list of (key, value) pairs.

您在分配

时失去了对字典的引用
a = a.items()