关于python:树实现中的奇怪引用行为

Bizarre reference behavior in Tree implementation

本问题已经有最佳答案,请猛点这里访问。

在一个更大的系统中,我完全被一个错误所困扰。考虑这个类(每个节点维护一个指向其父节点的指针和子节点的列表):

1
2
3
4
5
6
7
8
9
10
11
12
class Node:
    children = []

    def __init__(self, parent):
        self.contents = dict()
        self.parent = parent

        if parent is not None:
            print self.children
            print parent == self
            parent.children.append(self)
            print self.children

运行此:

1
2
foo1 = Node(None)
foo2 = Node(foo1)

神秘地返回:

1
2
3
[]
False
[<__main__.Node instance at 0x10051f128>]

这有什么意义吗?为什么第二个节点的子节点不为空?也许我对一个与Python如何传递引用相关的概念缺乏基本的理解。


您已经将children定义为类变量。它由全班所有成员共享。将声明移入__init__并将其更改为self.children = [],您将得到预期的结果。