我可以這樣做:爲什麼「del x」不會在x.append時更改生成器的結果?
>>> 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]
這可以讓我覺得發電機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]
這讓我覺得發電機b仍然指向列表a。所以我想知道發電機是如何構建的。或者,也許在第一種情況下x是如何被刪除的。
'del x'不一定刪除'x'所引用的對象。它只是刪除*名稱'x' *。所以,是的,發電機仍然有一個「a」的參考。 –
所以內容仍然在內存中?那麼內存何時真的被釋放? – ssd
當對象的所有引用都被刪除時,釋放內存。在你的情況下,生成器在名稱「x」被刪除後仍然保存着對象的引用 – inspectorG4dget