Python Append函数将元素添加到列表的成员

Python Append函数将元素添加到列表的成员,python,python-class,Python,Python Class,如何将类对象附加到列表而不修改其成员 类节点: def uuu init(self、name、type、children=[]): self.name=名称 self.type=type self.children=儿童 def添加子节点(自身、子节点): self.children.append(子节点) def打印节点(自身,缩进=0): 打印(self.name+“有子项”+str(len(self.children))) #对于self.children中的子项:打印(子项,缩进+4)

如何将类对象附加到列表而不修改其成员

类节点:
def uuu init(self、name、type、children=[]):
self.name=名称
self.type=type
self.children=儿童
def添加子节点(自身、子节点):
self.children.append(子节点)
def打印节点(自身,缩进=0):
打印(self.name+“有子项”+str(len(self.children)))
#对于self.children中的子项:打印(子项,缩进+4)
如果名称=“\uuuuu main\uuuuuuuu”:
A=节点(“A”、“公司”)
B=节点(“B”、“部门”)
B.printNode()
A.增加儿童(B)
B.printNode()
append()
函数将节点B添加到自身中,即使它只应将其添加到节点A的子列表中(从输出中可以明显看出)

B has children 0
B has children 1
永远不要使用可变数据(如列表)作为默认参数。像这样重新定义构造函数,它将按预期工作

def __init__(self, name, type, children=None):
    self.name = name
    self.type = type
    self.children = children if children else []

在Python中定义函数的参数时,您偶然发现了一个非常常见的问题。这是一个很好的解释

定义函数时,Python解释器将创建用作默认参数的值。然后,这些默认值将用于每个函数调用。在这种情况下,当解释
\uuuu init\uuuu
时,将创建空列表
子项=[]
。然后,每次调用
add\u child()
时,都会使用相同的列表,无论在哪个对象上调用它

下面是一个例子:

def my_func(a_list=[]):
一个列表。附加(“某物”)
打印(a_列表)
>>>my_func()
[“某物”]
>>>my_func()
[“某物”,“某物”]
在这种情况下,
每个函数调用都会重复使用一个\u列表
,并且其大小会继续增加

解决这个问题的方法是使用一个不同的值来表示节点应该以一个空的子列表开始。像这样:

类节点:
def uuu init uuuu(self、name、type、children=None):
self.name=名称
self.type=type
self.children=儿童或[]
...
阅读更多信息并