Повреждение стека Python? - PullRequest
       6

Повреждение стека Python?

4 голосов
/ 25 декабря 2011

Я относительно новичок в python (но не в программировании), и я не могу объяснить следующее поведение.Похоже, что переменная (список "children" в моем примере) из одного объекта ("child") перезаписывается значением этой переменной в совершенно другом объекте ("node").Чтобы дать некоторый контекст, я пытаюсь создать простой класс Node для использования в древовидной структуре.У узла есть дочерние элементы и родительский элемент (все остальные узлы).

Я не могу понять, почему child.children получает то же значение, что и node.children.Они как-то ссылаются на одни и те же данные?Зачем?Код и выходные данные выглядят следующим образом:

class Node:
    children = []
    parent = 0
    visited = 0
    cost = 0
    position = (0, 0)
    leaf = 0

    def __init__(self, parent, pos):
        self.parent = parent
        self.position = pos

    def addChild(self, node):
        self.children += [node]

node = Node(0, (0,0))
child = Node(node, (3,2))

node.addChild(child)

print "node: ",
print node

print "node.childen: ",
print node.children

print "child: ",
print child

print "child.children",
print child.children

Выходные данные:

node:  <__main__.Node instance at 0x414b20>
node.childen:  [<__main__.Node instance at 0x414b48>]
child:  <__main__.Node instance at 0x414b48>
child.children [<__main__.Node instance at 0x414b48>]

Как вы можете видеть, оба файла node.children и child.children имеют одинаковое значение (список, содержащий дочерний элемент), хотяЯ только обновил node.children.Спасибо за любую помощь!

Ответы [ 2 ]

6 голосов
/ 25 декабря 2011

Переменная children была объявлена ​​как переменная уровня класса, поэтому она используется всеми экземплярами ваших Node s. Вам нужно объявить его переменной экземпляра, установив его в инициализаторе.

class Node:
    #children = [] # not here...
    parent = 0     # might want to rethink where you initialize these
    visited = 0
    cost = 0
    position = (0, 0)
    leaf = 0

    def __init__(self, parent, pos):
        self.parent = parent
        self.position = pos
        self.children = [] # ...but here

    def addChild(self, node):
        self.children += [node]
2 голосов
/ 25 декабря 2011

Вы сделали 'children' атрибутом класса, что означает, что он используется всеми объектами этого класса.

Вместо этого инициализируйте его в методе init класса.

def __init__(self):
    self.children = []
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...