繁体   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