我试图在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的两个元素都不同?
答案 0 :(得分:1)
我试图在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)
如果您有一个现有的项目列表,您可以从中创建此对象数组,那么您可以做的最好的事情是使用list comprehension来构建新列表。例如,如果你有一个元组数组:
myOriginalData = [(1,2), (3,4), (5,6)]
myNewList = [TestDat(dat1=x, dat2=y) for (x,y) in myOriginalData]
答案 1 :(得分:0)
这里有几个错误:
首先,您从“对象”继承而来,无需显式放置它,可以将其保留为空。
第二,在类中声明变量的方式使该类在所有实例之间共享相同的值,这就是为什么总是获得最新的修改值。您应该改用“ 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)
答案 2 :(得分:-1)
你是对的,当你添加对象时,它会通过引用添加它们。
有几种方法可以做到这一点。可能最干净的只是为每个条目创建一个新对象。如果您绝对需要使用具有更改值的相同实例,则可以使用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
就可以了。