簡體   English   中英

在 Python 中創建對象數組

[英]Create an Array of objects in Python

我正在嘗試在 python 中創建一個對象列表。 我通過制作一個對象並附加它來做到這一點。 這是我的代碼。

#Creating a Python object
class TestDat(object):
     Dat1 = None
     Dat2 = None
#Declaring the Test Array
TestArray = []
#Declaring the object
Test1 = TestDat()
#Defining the member variables in said object
Test1.Dat1 = 0
Test1.Dat1 = 1
#Appending the object to the List
TestArray.append(Test1)
#Rewriting and appending again
Test1.Dat1 = 3
Test1.Dat1 = 4
TestArray.append(Test1)
#Printing our Our Results
print TestArray[0].Dat1
print TestArray[1].Dat1

當我測試它時。 我得到輸出“4 4”。 這意味着列表的兩個元素是相同的。 似乎 append 只是復制指向對象的指針而不是所述對象的副本。 我最終想在循環中執行此操作,因此我不能這樣做。 如何在不使用新對象的情況下使 List 的兩個元素不同?

我正在嘗試在 python 中創建一個對象列表。 我通過制作一個對象來做到這一點

你根本不能這樣做; 你的第二個陳述與你的第一個陳述相矛盾。 您必須實例化盡可能多的對象,故事結束。 即使您嘗試使用某種copy功能,它也只是在幕后為您創建了一個新實例。

您可以做的是使用for循環來創建數組。

testArray = []
for i in range(10):
    testDat = TestDat(dat1=i, dat2=i*2)
    testArray.append(testDat)

如果您不想使用for循環,您可以在將其附加到數組之前實例化一個新實例。

testArray = []
testDat = TestDat(dat1=1, dat2=2)
testArray.append(testDat)
testDat = TestDat(dat1=3, dat2=4) # re-assigns the variable to the new instance
testArray.append(testDat)

如果您有一個現有的項目列表,您可以從中創建這個對象數組,那么您可以做的最好的事情是使用列表理解來構建新列表。 例如,如果您有一組元組:

myOriginalData = [(1,2), (3,4), (5,6)]
myNewList = [TestDat(dat1=x, dat2=y) for (x,y) in myOriginalData]

這里有幾個錯誤:

首先,你是從“object”繼承而來的,不需要顯式放置它,你可以把它留空。

其次,您在類中聲明變量的方式使類在所有實例中共享相同的值,這就是為什么您總是獲得最新修改的值。 您應該改用“self.variable”,並為此聲明一個構造函數。

第三,您要修改 Test1.Dat1 4 次並附加同一個對象兩次。 這就是為什么你每次都得到相同的對象。

這是正確的方法:

class TestDat():          # leave this empty
    def __init__(self):   # constructor function using self
        self.Dat1 = None  # variable using self.
        self.Dat2 = None  # variable using self
    
TestArray = [] #empty array

Test1 = TestDat() #this is an object
Test2 = TestDat() #this is another object
        
Test1.Dat1 = 0 #assigning value to object 1 
Test1.Dat2 = 1 #assigning value to object 1 
    
Test2.Dat1 = 3 #assigning value to object 2 
Test2.Dat2 = 4 #assigning value to object 2

TestArray.append(Test1) #append object 1
TestArray.append(Test2) #append object 2 
    
print (TestArray[0].Dat1) # this is Test1
print (TestArray[1].Dat1) # this is Test2

甚至更簡單:

class TestDat():
    def __init__(self, Dat1, Dat2):
        self.Dat1 = Dat1
        self.Dat2 = Dat2

TestArray = [TestDat(0,1),
             TestDat(3,4)]

print (TestArray[0].Dat1) # this is Test1
print (TestArray[1].Dat1) # this is Test2

或者這樣:

class TestDat():
    def __init__(self):
        self.Dat1 = None
        self.Dat2 = None
    
TestArray = [] #empty array
size = 2       #number of loops

for x in range(size):  # appending empty objects
    TestArray.append(TestDat())

#initialize later
TestArray[0].Dat1 = 0
TestArray[0].Dat2 = 1

TestArray[1].Dat1 = 3
TestArray[1].Dat2 = 4

print("print everithing")
for x in range(len(TestArray)):
    print("object "+str(x))
    print(TestArray[x].Dat1)
    print(TestArray[x].Dat2)

你是對的,當你添加對象時,它確實通過引用添加它們。

有幾種方法可以做到這一點。 可能最干凈的就是為每個條目創建一個新對象。 如果您絕對需要使用具有更改值的相同實例,則可以使用copy.copy

from copy import copy
...
# Set up object
TestArray.append(copy(test1))
# Change stuff
TestArray.append(copy(test2))

請參閱: https : //docs.python.org/2/library/copy.html以了解copy (又名淺拷貝)和deepcopy之間的差異,因為根據對象的復雜性,這可能很重要。 如果復制對象很重要,它還會告訴您如何實現__copy____deepcopy__

所以,TL;DR 是我真的建議使用新對象並阻止可變性,但如果需要, copy就在那里。

暫無
暫無

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

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