[英]Python references
我遇到了一種情況,我認為這揭示了我對Python引用工作方式的理解上的空白。
假設我們有兩個類:
class A:
def __init__(self):
self.x = [1,2,3]
def modify(self):
self.x.append(4)
def reset(self):
self.x = []
class B:
def __init__(self, x):
self._x = x
def say(self):
print self._x
a = A()
b = B(a.x)
b.say()
a.modify()
b.say()
a.reset()
b.say()
我期望的輸出是:
[1, 2, 3]
[1, 2, 3, 4]
[]
我得到的輸出是:
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
看來,當我調用reset()
並將self.x
設置為新列表時, B
持有的引用變得獨立並存在,從而成為副本而不是引用。 這是正確的理解嗎?
reset()
方法
def reset(self):
self.x = []
不會修改self.x
存儲的對象-而是創建一個新的空列表,然后將其存儲在self.x
。 舊列表不會更改(並且由於仍由b._x
引用,因此也不會進行垃圾回收)。 要獲得您想要的行為,請使用
def reset(self):
del self.x[:]
清空現有列表,而不是創建一個新列表。
當您將斧頭分配給[]時,您不是在清洗數組,而是在引用它時為斧頭分配一個新的空數組:b._x保持不變。 如果要修改並排列在適當的位置,請在刪除所有內容的情況下執行以下操作:
del a.x[:]
實際上,不是B中的_x成為副本,而是A中的x成為另一個列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.