为什么"del x"在x.append没有改变生成器的结果?

ssd*_*ssd 4 python garbage-collection generator

我可以做这个:

>>> x = [2,3,4] 
>>> y = (v * 2 for v in x)
>>> del x                          # x is deleted
>>> print(list(y))                 # y still exists
[4, 6, 8]
Run Code Online (Sandbox Code Playgroud)

这可能让我认为生成器y独立于列表x.但我也可以这样做:

>>> a = [2, 3, 4]
>>> b = (v * 2 for v in a)
>>> a.append(5)                   # change a
>>> print(list(b))                # b is also changed
[4, 6, 8, 10]
Run Code Online (Sandbox Code Playgroud)

这让我觉得生成器b仍然指向列表a.所以我想知道如何实际构建发电机.或者也许在第一种情况下有关于如何删除x的内容.

Bre*_*arn 6

del不删除对象.它删除了名字.只要有对象,对象仍然存在.名称x和生成器y都引用单个对象(列表).如果del x删除了名称x,但生成器仍保留其引用.如果修改x,生成器会看到它,因为它指的是同一个对象.