创建包含其他对象的对象列表时出现的Python基本问题
我有一个类是根容器。此容器有一个将保存对象的列表成员。这些对象中的每一个还包含子对象列表,这些子对象依次包含其他子对象。我想使用列表,因为手头的应用程序需要排序 问题:我发现子类的对象列表没有包含正确的对象集,列表的长度也不是我所期望的创建包含其他对象的对象列表时出现的Python基本问题,python,list,object,for-loop,instantiation,Python,List,Object,For Loop,Instantiation,我有一个类是根容器。此容器有一个将保存对象的列表成员。这些对象中的每一个还包含子对象列表,这些子对象依次包含其他子对象。我想使用列表,因为手头的应用程序需要排序 问题:我发现子类的对象列表没有包含正确的对象集,列表的长度也不是我所期望的 Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00> <-- New S2 object created here Line: 9 c: <__main__.myc instance
Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00> <-- New S2 object created here
Line: 9 c: <__main__.myc instance at 0x023ABD28> <-- New c object created here
Line: 10 Adding C <__main__.myc instance at 0x023ABD28> to S2 <__main__.mycls2 instance at 0x023ABD00> Len: 3 <-- Adding newly created c to new s2.
下面是一些示例代码(代码可以复制和执行),非常简单。我使用了python 2.6.2
class mycls2:
olist = []
class mycls1:
olist = []
class mycl:
olist = []
class myc:
x = 0
def __init__(self, i):
self.x = i
def test_obj1():
kctr = 0
mylist = mycl()
for i in range(0, 2):
s1 = mycls1()
print "s1: ", s1
for j in range(0, 2):
s2 = mycls2()
print "s2: ", s2
for k in range(0, 2):
c = myc(kctr)
kctr += 1
print " c: ", c
s2.olist.append(c)
print "Adding C ", c, " to S2 ", s2, " Len:", len(s2.olist)
s1.olist.append(s2)
print "Adding S2 ", s2, " to S1 ", s1, " Len:", len(s1.olist)
mylist.olist.append(s1)
print "Adding S1 ", s1, " to ML ", mylist, " Len:", len(mylist.olist)
print '========================================'
print "MyCL1List:", len(mylist.olist)
for mycl1_iter in mylist.olist:
print mycl1_iter
print "MyCL2List:", len(mycl1_iter.olist)
for mycl2_iter in mycl1_iter.olist:
print mycl2_iter
print "MyCL:", len(mycl2_iter.olist)
for mycl_ter in mycl2_iter.olist:
print mycl_ter
print '========================================'
if __name__ == "__main__":
test_obj1()
输出代码段:
Line: 1 s1: <__main__.mycls1 instance at 0x023ABC60>
Line: 2 s2: <__main__.mycls2 instance at 0x023ABC88>
Line: 3 c: <__main__.myc instance at 0x023ABCB0>
Line: 4 Adding C <__main__.myc instance at 0x023ABCB0> to S2 <__main__.mycls2 instance at 0x023ABC88> Len: 1
Line: 5 c: <__main__.myc instance at 0x023ABCD8>
Line: 6 Adding C <__main__.myc instance at 0x023ABCD8> to S2 <__main__.mycls2 instance at 0x023ABC88> Len: 2
Line: 7 Adding S2 <__main__.mycls2 instance at 0x023ABC88> to S1 <__main__.mycls1 instance at 0x023ABC60> Len: 1
Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00>
Line: 9 c: <__main__.myc instance at 0x023ABD28>
Line: 10 Adding C <__main__.myc instance at 0x023ABD28> to S2 <__main__.mycls2 instance at 0x023ABD00> Len: 3
行:1 s1:
行:2 s2:
第3行c:
行:4将C添加到S2 Len:1
第5行c:
行:6将C添加到S2 Len:2
行:7将S2添加到S1 Len:1
第8行s2:
第9行c:
行:10将C添加到S2 Len:3
问题:
1) 第8行、第9行和第10行中看到的行为不是我所期望的
Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00> <-- New S2 object created here
Line: 9 c: <__main__.myc instance at 0x023ABD28> <-- New c object created here
Line: 10 Adding C <__main__.myc instance at 0x023ABD28> to S2 <__main__.mycls2 instance at 0x023ABD00> Len: 3 <-- Adding newly created c to new s2.
行:8 s2:
在所有这些类中,olist
是一个类变量。因此,这些类的所有实例都将共享与其类对应的olist
您需要的是实例变量
class mycls2:
def __init__(self):
self.olist = []
class mycls1:
def __init__(self):
self.olist = []
class mycl:
def __init__(self):
self.olist = []
感谢您的分享,我感谢您的快速回复。
class mycls2:
def __init__(self):
self.olist = []
class mycls1:
def __init__(self):
self.olist = []
class mycl:
def __init__(self):
self.olist = []