亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python用numpy數組類型附加類屬性

Python用numpy數組類型附加類屬性

米琪卡哇伊 2021-05-07 18:28:41
我想調用一個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 += 1x = x + 1具有相同的結果。在這兩種情況下,x都是反彈到一個新的整數對象。

當你做self.x += 1一個numpy的數組,你就不會更改引用該self.x點。沒有分配新的數組,而是現有數組的內部緩沖區中的每個元素都增加。請注意,分配仍然會發生,但是引用與以前相同。

要在此上下文中模擬整數的行為,請明確寫出所需的操作:

self.x = self.x + 1

在這種情況下self.x + 1是一個全新的數組,然后可以將其重新分配self.x為整數。

關于如何修復代碼,您有兩個選擇:

  1. 如果可以每次都創建一個新數組并丟棄前一個數組,可以update按上述方法更改方法。在某些方面,此解決方案是最干凈的,因為它可以最大程度地減少對外部參考的影響。同時,您可能不想每次都創建一個新副本。

  2. 如果您想在大多數情況下避免創建不必要的副本(或者至少可以控制何時創建副本),請使用@DYZ的建議。代替a.append(y),做

    a.append(y.copy())

    或者,立即復制:

    y = cl_2.update().copy()

TL; DR

最常見的初學者陷阱發生在這里:從對同一可變對象的引用創建一個列表,然后對該對象進行突變。如預期的那樣,所有引用都將以對象的最后一個值結束。


查看完整回答
反對 回復 2021-05-18
  • 1 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號