Я как-то новичок в питоне.Мне нужно было использовать дерево для хранения некоторых данных (пути к файлам). Проблема в том, что когда я генерирую дерево, кажется, что все объекты после корня ссылаются на один и тот же объект, хотя пошаговая отладка показала обратное.Вот мой (свернутый) код: сначала класс узла:
class PathElement:
Element = ""
IsStatic = True
Children = []
ChildrenCount = 0
def __init__(self, Element, IsStatic=True):
self.Element = Element
self.IsStatic = IsStatic
if not IsStatic:
self.Element = []
def AddChild(self, Child):
print(self, " ", Child)
self.Children.append(Child)
self.ChildrenCount = len(self.Children)
return Child
Дети - это список узлов PathElement.Код, который строит дерево:
def UnFoldAndCheck(self):
Path = PathElement("root")
Handler = Path
Index = 0
Count = len(self.Path)
while Index < Count:
element = self.Path[Index]
if something:
Child = None
Child = PathElement(element)
Handler.AddChild(Child)
Handler = None #Those added to debug the problem
Handler = Child
elif other_thing:
if condition:
if some_large_condition:
ChildExec = None
ChildExec = PathElement(element, False)
for i in range(0, 5):
ChildExec.Element.append(self.Path[Index + i])
Handler.AddChild(ChildExec)
Handler = None
Handler = ChildExec
Index += 4
elif another_condition:
ChildOp = None
ChildOp = PathElement(element, False)
Handler.AddChild(ChildOp)
Handler = None
Handler = ChildOp
elif some_else_condition:
if condition:
ChildExec = None
ChildExec = PathElement(element, False)
for i in range(0, 3):
ChildExec.Element.append(self.Path[Index + i])
Handler.AddChild(ChildExec)
Handler = None
Handler = ChildExec
Index += 2
elif different_condition:
ChildExec = None
ChildExec = PathElement(element, False)
for i in range(0, 3):
ChildExec.Element.append(self.Path[Index + i])
Handler.AddChild(ChildExec)
Handler = None
Handler = ChildExec
Index += 1
Index += 1
return Path
Моя проблема в том, что после того, как дерево построено, когда я его использую, оно всегда будет иметь одинаковую структуру: root -> объект с 3 точными узлами -> один и тот же объект ->тот же объект до бесконечности, в то время как ожидаемый: root -> объект -> первые дети -> вторые дети -> третьи дети -> и т.д. Я уверен, что проблема связана с тем, как python обрабатывает ссылки на объекты, но я не могу видеть, гдепроблема точно.Любая помощь?
Обновление:
Я воспроизвел проблему с меньшим кодом (тот же класс PathElement):
from PathElement import PathElement
Path = PathElement("root")
Handler = Path
for i in range(1,6):
Child = PathElement("child"+str(i))
Handler.AddChild(Child)
Handler = Child
Tree = Path
while True:
print(Tree.Element)
if len(Tree.Children) > 0:
Tree = Tree.Children[0]
else:
break
Этот код сделает бесконечный цикл