簡體   English   中英

列表中的項目成為最后添加項目的副本

[英]Items in the list become copy of last item added

我最近開始學習 python 並遇到了問題。 我想創建一個包含“值”class 的幾個不同實例的列表:

class Value:
    x = []
    y = []

data1 = Value
data1.x = 1, 2
data1.y = 2, 3

data2 = Value
data2.x = 3, 4
data2.y = 4, 5

但是當我將這些元素添加到列表中時,列表中有我需要的 2 個元素,但由於某種原因,第一個元素是第二個元素的副本,即第一個元素的字段變為 x == 3、4 和 y = = 4, 5 與第二個類似:

answer.append(data1) // answer[0].x == 1, 2    answer[0].y == 3, 4
answer.append(data2) // answer[0].x == 3, 4    answer[0].y == 4, 5

我需要做什么來解決這個問題?

實際上,當您編寫時,它相當簡單:

data1 = Value 
data2 = Value

您正在引用 class 而不是創建實例。 通過寫作:

data1.x = 1, 2
data1.y = 2, 3

您現在正在更改 class 的實際值,而不是實例的值。 因此,當您執行以下操作時:

data2.x = 3, 4
data2.y = 4, 5

您正在更改 class 值,而不是值的實例 您可以通過打印輕松檢查:

print(Value.x)
print(Value.y)

所以寫

data1 = Value
data2 = Value

和寫法一樣:

data1 = data2 = Value

你想使用:

data1 = Value()
data2 = Value()

創建您可以單獨修改的 class 的不同實例

你的代碼有一些問題。 使用data1 = Value您只需給 class Value一個額外的名稱data1 要創建 class 的實例,您必須執行data1 = Value()

但是現在下一個問題出現了。 您將xy定義為 class 的屬性,並且這兩個值都是空列表。 然后使用data1.x = 1, 2創建一個實例屬性,它是一個tuple ,與同名的 class 屬性無關。 現在,當您嘗試將 append 設置為x時,它將無法正常工作。

class Value:
    x = []

data1 = Value()
data1.x = 1, 2
data1.x.append(4)

這將導致錯誤: AttributeError: 'tuple' object has no attribute 'append'

不要從外部重新創建可變屬性(或至少使用與以前相同的數據類型)。 使用屬性方法來改變它。

class Value:
    x = []

data1 = Value()
data1.x.extend((1, 2))
data1.x.append(4)
print(data1.x)

這會給你[1, 2, 4]

結果看起來不錯,但事實並非如此。 讓我們添加第二個實例。

class Value:
    x = []

data1 = Value()
data1.x.extend((1, 2))
data1.x.append(4)
print(data1.x)

data2 = Value()
data2.x.append(5)

print(data1.x)
print(data2.x)

data1.xdata2.x的結果是[1, 2, 4, 5] 但為什么?

我之前提到過您創建了 class 屬性。 class 屬性在所有實例中共享它們的值。 如果你想要一個實例屬性,你必須在實例上定義它。 當您創建 class 的實例時,將調用__init__方法,這就是您必須創建屬性的地方。

class Value:
    def __init__(self):
        self.x = []

data1 = Value()
data1.x.extend((1, 2))
data1.x.append(4)
print(data1.x)

data2 = Value()
data2.x.append(5)

print(data1.x)
print(data2.x)

現在我們按預期得到[1, 2, 4][5]

添加第二個屬性y應該很容易。

你應該使用如下類

class Value:
    x = []
    y = []


data1 = Value()
data1.x = 1, 2
data1.y = 2, 3

data2 = Value()
data2.x = 3, 4
data2.y = 4, 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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