用自身的生成器替换变量
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()
也许这是一个愚蠢的问题,但我想知道为什么这真的有效:
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()