Python создает статические объекты, которые являются общими для всех объектов класса - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть узел класса что-то вроде этого.Это типичный объект узла для графа.

class Node(object):
    def __init__(self, data, edges = []):
        super(Node, self).__init__()
        self.data = data
        self.edges = edges
        self.visited = False

    def addEdge(self, *args):
        print(self)
        self.edges.extend(args)
        print(self.edges)

Я создаю два таких объекта:

one = Node(1)
two = Node(2)

Далее я добавляю указатель two к one, используя addEdge метод, определенный выше -

one.addEdge(two)

Теперь приходит удивительный момент.Когда я проверяю значения one.edges и two.edges, я получаю это -

one.edges [<<strong> main .Node объект в 0x109ed3e50>]

two.edges [<<strong> main .Node объект в 0x109ed3e50>].

Если вы видите, что оба объекта получили значение.Я довольно озадачен этим и не знаю, почему это происходит.Так ведет себя питон?Если да, то можете ли вы объяснить это поведение?

1 Ответ

0 голосов
/ 29 декабря 2018

Вы должны быть осторожны при использовании литерала массива в качестве значения по умолчанию, потому что вы не получаете новый массив с каждым экземпляром - вы получаете ссылку на тот же самый.В вашем примере вы увидите:

>> one.edges is two.edges
True

Вам нужно что-то сделать, чтобы каждый раз получать новый массив.Вы можете сделать одну вещь:

self.edges = list(edges)

Другой вариант:

def __init__(self, data, edges = None):

   if edges is None:
        self.edges = []
   else:
        self.edges = edges

Но edges все еще изменчив, так что это может также привести к незначительным ошибкам, если вызывающая сторона не ожидаетэто должно быть изменено.

...