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

时间:2018-12-03 07:18:42

标签: python class oop instance

在下面的代码中,我定义了一个Node类,该类在实例化时应具有一个空的“ childarr”属性。然后,我实例化该类并将其传递给方法“ expnd”。这将三个新节点添加到childarr数组。正如预期的那样,第一个打印语句显示“节点”实例的子级的长度为3。但是现在,我从头开始实例化“节点”类的新实例。由于我在类的 init 方法中指定,如果对此变量不进行任何传递,则该变量应为空数组,因此我期望nn具有空的childarr属性。但是,第二个打印语句显示它实际上也有三个孩子。

令我非常困惑的是,为什么“ 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)))

1 个答案:

答案 0 :(得分:1)

问题在于,您使用在<session-config> <cookie-config> <!-- <http-only>true</http-only> --> <secure>true</secure> </cookie-config> <tracking-mode>COOKIE</tracking-mode> </session-config> 定义中创建的相同的空列表实例实例化了所有“空” childarr。 更改此行为的一种方法:

__init__

结果:

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)))