У меня есть класс, который является корневым контейнером. Этот контейнер имеет элемент списка, который будет содержать объекты. Каждый из этих объектов дополнительно содержит список вспомогательных объектов, и эти вспомогательные объекты поочередно удерживают другие вспомогательные объекты. Я хотел бы использовать списки, потому что упорядочение вопросов для приложения под рукой.Основная проблема Python при создании списка объектов, содержащих другие объекты
Проблема: Я вижу, что списки объектов подкласса не содержат нужного набора объектов, а длина списков - это не то, что я ожидал.
Вот пример кода (код может быть скопирован и выполнен) и довольно прямолинейный. Я использовал 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) Поведение видно на линиях 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.
Как получается, что длина 3 на линии 10, когда вновь созданный объект должен иметь длину 1 после того, как только что добавили объект.
2) При печати содержимого списка я вижу, что в список, который я ожидал, добавлено больше предметов. Я бы ожидал только 2 объекта C здесь, в объекте S2? Почему это происходит?
Line: 43 <__main__.mycls2 instance at 0x023ABD00> <-- Would have expected only 2 C objects here
Line: 44 MyCL: 8
Line: 45 <__main__.myc instance at 0x023ABCB0>
Line: 46 <__main__.myc instance at 0x023ABCD8>
Line: 47 <__main__.myc instance at 0x023ABD28>
Line: 48 <__main__.myc instance at 0x023ABD50>
Line: 49 <__main__.myc instance at 0x023ABDC8>
Line: 50 <__main__.myc instance at 0x023ABDF0>
Line: 51 <__main__.myc instance at 0x023ABE40>
Line: 52 <__main__.myc instance at 0x023ABE68>
Line: 53 <__main__.mycls2 instance at 0x023ABDA0>
Я думаю, что мне не хватает чего-то фундаментального, может ли кто-нибудь помочь?
Спасибо за обмен, и я ценю быстрый ответ. – MSR
@MSR Добро пожаловать :) – thefourtheye