为什么我的类属性在Python中会自动更改?

为什么我的类属性在Python中会自动更改?,python,class,Python,Class,当我试图改变一个特定实例中的类属性时,所有其他实例的属性也会改变。即使我创建了一个全新的类实例,它的属性也会自动更改 我正在尝试实现一个树型数据结构。我认为这个问题与继承有关,但我想不出来 #在这里,我将创建一个简单的类来表示 #树的节点 类节点: 定义初始化(self,children=[]): self.children=儿童 根=节点() 分支=节点() #现在我把树枝变成了根的孩子 root.children.append(分支) #而且它是有效的。。。 儿童 >>>[] #……但出于

当我试图改变一个特定实例中的类属性时,所有其他实例的属性也会改变。即使我创建了一个全新的类实例,它的属性也会自动更改

我正在尝试实现一个树型数据结构。我认为这个问题与继承有关,但我想不出来


#在这里,我将创建一个简单的类来表示
#树的节点
类节点:
定义初始化(self,children=[]):
self.children=儿童
根=节点()
分支=节点()
#现在我把树枝变成了根的孩子
root.children.append(分支)
#而且它是有效的。。。
儿童
>>>[]
#……但出于某种原因,布兰奇现在也有了一个孩子
儿童
>>>[]
#现在我提出一个全新的例子
#未连接到根或分支
孤立节点=节点()
#不知怎的,它也有一个我从未给过它的孩子
孤立子节点
>>>[]

我不知道为什么每个节点都有一个子节点。我只希望节点有子节点,如果我指定它应该有子节点。在上面的代码中,root是唯一一个应该有子对象的对象(或者我是这么想的)。

如果您面临的是所谓的可变默认参数,请尝试以下操作:

class Node:

    def __init__(self, children=None):
        if children is None:
            children = []
        self.children = children
基本上,您有这个问题是因为:

  • 函数声明只执行一次,创建所有 默认值对象
  • 一切都是通过引用传递的

尽管这被标记为重复,但考虑到您对堆栈溢出非常陌生,我添加了一个答案。我希望这有帮助,如果你需要进一步的解释,请告诉我。