Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用自身的生成器替换变量_Python_Generator - Fatal编程技术网

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()