List.append заменяет все элементы на самый последний элемент - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть класс Node, в котором есть имя и массив, и класс Graph, который должен иметь массив объектов Node:

class Node:
    name = ""
    next = []

class Graph:
    nodes = [] # nodes is an array consisting of Node objects 

Я создал функцию, которая добавляет объект Node в граф при передаче строки.


def add_new(self, new_name):
        new_node = Node
        new_node.name = new_name
        self.nodes.append(new_node)
        print("New node given name: ", new_name)
        print("New length of nodes: ", len(self.nodes))

graph2 = Graph

add_new(graph2, "Jim")
add_new(graph2, "Dwight")
add_new(graph2, "Andy")

print("Node names: ")
for i in range(0,3):
    print(graph2.nodes[i].name)

Вместо фактического добавления new_node, функция, кажется, заменяет все предыдущие элементы массива узлов на последний объект new_node.

python -u "c:\Users\Vishnu\CS-Project\why.py"
New node given name:  Jim
New length of nodes:  1
New node given name:  Dwight
New length of nodes:  2
New node given name:  Andy
New length of nodes:  3
Node names:
Andy
Andy
Andy

Как это происходит? Разве new_node не является локальной переменной, и не должна ли она быть свежей при каждой итерации функции?

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Атрибуты, установленные на уровне класса, являются статическими, то есть общими для всех экземпляров класса.Вы, вероятно, хотите:

class Node:
    def __init__(self):
        self.name = ""
        self.next = []

class Graph:
    def __init__(self):
        self.nodes = []

Кроме того, вам нужно вызвать класс для создания экземпляра - так что вы хотите new_node = Node() и graph2 = Graph().

0 голосов
/ 17 апреля 2019

Вам нужно создать экземпляры классов Node и Graph.

class Node:
    def __init__(self, name):
        self.name = name

class Graph:

    def __init__(self):
        self.nodes = list()

    def add_new(self, new_name):
        new_node = Node(new_name)
        self.nodes.append(new_node)
        print("New node given name: ", new_name)
        print("New length of nodes: ", len(self.nodes))

graph2 = Graph()

graph2.add_new("Jim")
graph2.add_new("Dwight")
graph2.add_new("Andy")

print("Node names: ")
for i in range(0,3):
    print(graph2.nodes[i].name)

Помните, что self является ссылкой на экземпляр объекта вашего класса. Это часть определения класса и синтаксиса, специфичного для Python.

Создание объекта python из класса выполняется простым добавлением () в конец класса. В Java вы также должны сказать new.

Вы определяете класс следующим образом:

class Person():
    def __init__(self, some_var):
        self.some_var = some_var
    def some_method(self, msg):
        print("He said:", msg)

Затем вы создаете из него объект следующим образом:

my_person = Person('my_var')

Тогда вы можете использовать метод, подобный этому:

my_person.some_method('FooBar')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...