簡體   English   中英

Python參考

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM