Python 用自身的生成器替换变量
也许这是一个愚蠢的问题,但我想知道为什么这真的有效:Python 用自身的生成器替换变量,python,generator,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
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
导致类型错误
,因为
“dict_items”对象不可订阅
这是因为在计算表达式之前,
a
不会被赋值。也就是说,a.items()
作为生成器进行计算,然后将a
分配给它。生成器没有因为a
不再引用字典而更改。字典仍然存在;它不再被称为a
。如果你这样做的话
type(a) #before creating b
你会得到
=> <class 'dict_items'>
分配任务时,您丢失了对词典的引用
a = a.items()
好的,我刚刚使用了
dict.items()
作为示例,如果用a=(a中的键对键)
替换它,为什么它仍然有效?这是一个生成器?因为a=(a中的键对键)返回一个生成器,但关于生成器的要点是,它们不保存/返回副本。是的,这就是为什么如果使用带循环的生成器,您可以使用“yield”关键字传递该项。它的工作原理类似于迭代器,但每次循环时,它都会返回一个项。@jmugz3:我们在这里讨论的是Python 3.x。items
的文档中说:“返回字典项((键、值)对的新视图。”“如果生成器没有将遍历的所有值都拉入内存,您是否想知道生成器如何知道要遍历哪些值,那么,一旦你覆盖了原始值,他们怎么知道该怎么做呢?@IanAuld-我想是的。我真的很难理解这个问题,我不太清楚你的意思。但我想知道:生成器只是被告知在哪里迭代,所以如果我删除(或覆盖)原始内容,生成器如何仍然知道返回什么。
a = a.items()