[英]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()
。
但是現在下一個問題出現了。 您將x
和y
定義為 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.x
和data2.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.