gpt4 book ai didi

python - 在 Python 中,为什么 .append 给出的结果与使用 + 不同?

转载 作者:行者123 更新时间:2023-12-01 00:36:03 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why does using `arg=None` fix Python's mutable default argument issue?

(5 个回答)


2年前关闭。




我想在 Python 中实现一个非常简单的树数据结构。
我想这样做,以便每次添加新节点并指定其父节点时,它都会自动添加到其父节点的 children 属性中。

我有两种不同的方法,一种有效,一种无效,但我不明白为什么。

class Node():
def __init__(self, value, parent = None, children = []):
self.value = value #This is for us to see the name
self.parent = parent #Parent node
self.children = children #List of child nodes

#Set this Node as a children of its own parent
if not parent == None:
#self.parent.children.append(self) <--- wrong code
self.parent.children = self.parent.children + [self]

def __repr__(self):
return str(self.value)

tree = Node("tree")
branch1 = Node("branch1", parent = tree)
branch2 = Node("branch2", parent = tree)
leaf = Node("leaf", parent = branch1)

这是我得到的代码以及如果我替换 __init__ 的最后一行会得到的结果带有注释的行。

print(tree.children)
#[branch1, branch2] <--- expected
#[branch1, branch2, leaf] <--- with wrong code

print(branch1.children)
#[leaf] <--- expected
#[branch1, branch2, leaf] <--- with wrong code

使用 .append方法不仅将节点添加到列表 children它的 parent ,但对每个人。即使我定义了一个新的 Node("other")完全脱离其他人。这是为什么?

最佳答案

问题在于使用可变默认值:

def __init__(self, value, parent = None, children = []):

空列表 []仅在定义函数时创建一次,并且所有调用共享同一个列表!这就是为什么 append到一个 child 列表修改所有 child - 因为他们都是同一个列表对象。当您使用 +要 append 到列表,您可以解决上述错误,因为您每次都重新创建列表,从而取消共享子对象。

正确的解决方法是替换 children=[]有类似的东西:
def __init__(self, value, parent=None, children=None):
if children is None:
children = []

这将保证为 child 创建一个新列表,然后 append+应该有相同的结果。

关于python - 在 Python 中,为什么 .append 给出的结果与使用 + 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57752320/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com