Python将类实例传递给方法并修改属性会导致新的、不相关的实例更改默认行为

2024-06-26 03:51:44 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的代码中,我定义了一个节点类,该类在实例化时应该有一个空的“childarr”属性。然后,我实例化该类并将其传递给方法“expnd”。这将向childarr数组添加三个新节点。正如所料,第一个print语句显示“node”实例的childarr的长度是3。但是现在,我从头开始实例化“node”类的一个新实例。由于我在类的init方法中指定,如果没有为该变量传递任何内容,则该变量应为空数组,因此我希望nn具有空childarr属性。然而,第二个print语句显示它实际上也有三个孩子

我很困惑为什么“nn”会受到实例化之前发生的一些代码的影响,而这些代码与它无关

有没有人知道这种行为的原因,以及我在最佳实践方面遗漏了什么

class Node():
    def __init__(self, childarr=[]):
        self.childarr = childarr

def expnd(node):
    for i in range(3):
        newnode = Node()
        node.childarr.append(newnode)

node=Node()
expnd(node)
print("Length of child array of expanded node:" + str(len(node.childarr)))

nn = Node()
print("Length of child array of new, unrelated node:" + str(len(nn.childarr)))

Tags: of实例方法代码node属性节点init
1条回答
网友
1楼 · 发布于 2024-06-26 03:51:44

问题是,您使用在__init__定义中创建的同一个空列表实例实例化了所有的“empty”childarr。 改变这种行为的一种方法:

class Node():
    def __init__(self, childarr=None):
        self.childarr = childarr or []

def expnd(node):
    for i in range(3):
        newnode = Node()
        node.childarr.append(newnode)

node=Node()
expnd(node)
print("Length of child array of expanded node:" + str(len(node.childarr)))

nn = Node()
print("Length of child array of new, unrelated node:" + str(len(nn.childarr)))

结果:

Length of child array of expanded node:3
Length of child array of new, unrelated node:0

相关问题 更多 >