Передача экземпляра класса Python методу и изменение свойства заставляет новые, не связанные экземпляры изменять поведение по умолчанию - PullRequest
0 голосов
/ 03 декабря 2018

В приведенном ниже коде я определяю класс Node, который при создании экземпляра должен иметь пустое свойство childarr.Затем я создаю экземпляр класса и передаю его методу expnd.Это добавляет три новых узла в массив childarr.Как и ожидалось, первый оператор print показывает, что длина childarr экземпляра "node" равна 3. Но теперь я создаю новый экземпляр класса "Node" с нуля.Так как я указал в методе 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 голосов
/ 03 декабря 2018

Проблема в том, что вы создаете экземпляры всех "пустых" 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)))

Результат:

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