我对python相对较新(但不是编程),我无法解释以下行为。似乎一个对象(“child”)中的变量(我的示例中的列表“children”)被一个完全不同的对象(“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都具有相同的值(包含child的列表),即使我只更新了node.children。谢谢你的帮助!
答案 0 :(得分:6)
children
变量被声明为类级变量,因此它在Node
的所有实例之间共享。您需要通过在初始化程序中设置它来声明它为实例变量。
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]
答案 1 :(得分:2)
你已经让'children'成为了一个class属性,这意味着它在该类的所有对象之间共享。
相反,请在类的 init 方法中初始化它。
def __init__(self):
self.children = []
...