我想調用一個class屬性,并將其附加到列表中。這是一個簡單的腳本:class class_1(): def __init__(self): self.x = np.array([0, 0]) def update(self): self.x += 1 return self.xcl_1 = class_1()a = []for i in range(3): y = cl_1.update() print(y) a.append(y)print(a) # output:[1 1][2 2][3 3][array([3, 3]), array([3, 3]), array([3, 3])]但我希望[array([1, 1]), array([2, 2]), array([3, 3])]作為list的最終價值a。我檢查了python數字是否沒有問題:class class_2(): def __init__(self): self.x = 0 def update(self): self.x += 1 return self.xcl_2 = class_2()a = []for i in range(3): y = cl_2.update() print(y) a.append(y)print(a)#output123[1, 2, 3]
1 回答

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
與Python整數不同,numpy數組實際上允許就地修改。使用不可變的Python整數,x += 1
并x = x + 1
具有相同的結果。在這兩種情況下,x
都是反彈到一個新的整數對象。
當你做self.x += 1
一個numpy的數組,你就不會更改引用該self.x
點。沒有分配新的數組,而是現有數組的內部緩沖區中的每個元素都增加。請注意,分配仍然會發生,但是引用與以前相同。
要在此上下文中模擬整數的行為,請明確寫出所需的操作:
self.x = self.x + 1
在這種情況下self.x + 1
是一個全新的數組,然后可以將其重新分配self.x
為整數。
關于如何修復代碼,您有兩個選擇:
如果可以每次都創建一個新數組并丟棄前一個數組,可以
update
按上述方法更改方法。在某些方面,此解決方案是最干凈的,因為它可以最大程度地減少對外部參考的影響。同時,您可能不想每次都創建一個新副本。如果您想在大多數情況下避免創建不必要的副本(或者至少可以控制何時創建副本),請使用@DYZ的建議。代替
a.append(y)
,做a.append(y.copy())
或者,立即復制:
y = cl_2.update().copy()
TL; DR
最常見的初學者陷阱發生在這里:從對同一可變對象的引用創建一個列表,然后對該對象進行突變。如預期的那樣,所有引用都將以對象的最后一個值結束。
添加回答
舉報
0/150
提交
取消