用自身的生成器替换变量

Replacing variable with a generator of itself

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

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' object is not subscriptable

那是因为 a 在计算表达式之前不会被赋值。即a.items()被评估为生成器,然后a被赋值给它。生成器并没有因为 a 不再引用字典而改变。字典仍然存在;它只是不再被称为 a

如果你这样做

type(a) #before creating b 

你会得到

=> <class 'dict_items'>

记得a.items()returns一份。来自 documentation:

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

您在分配

时丢失了对词典的引用
a = a.items()