Ошибка при добавлении объекта класса в переменную списка в другом экземпляре того же объекта класса - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь написать простой код на Python. Я все еще слаб в основах Python и застрял в этом вопросе. У меня есть внутренний узел класса (). У него есть атрибут routeNodes, который является списком. Я использую его для хранения других экземпляров того же объекта класса (Node ()). Поэтому я сначала инициализирую Class firstNode и даю ему несколько фиктивных значений.

Затем я запускаю для l oop в течение 10 итераций. В каждой из итераций я создаю другой экземпляр того же класса Node (). Затем я добавляю объект firstNode (который снова является экземпляром Node ()) к каждому из этих классов secondNode.

Добавляет firstNode в переменную списка routeNode для seconddeNode.

Но он также добавляет объект firstnode в переменную списка routenode своего собственного объекта класса!

Один и тот же объект firstNode добавляется к обоим объектам класса. Почему это происходит? Могу ли я не добавлять объекты класса, как это? и как я могу предотвратить это?

Прикрепление моего кода. Вы можете запустить его в тестовом классе и отладить строку «secondNode.addRouteNodes (firstNode)», и вы поймете мою проблему.

class Node:
    kms = 0
    cumulativeKms = 0
    routeNodes = []
    nodeName = ""

    def __init__(self, nodeName):
        self.nodeName = nodeName

    def setNodeName(self, nodeName):
        self.nodeName = nodeName

    def getNodeName(self):
        return self.nodeName

    def setKms(self, kms):
        self.kms = kms

    def getKms(self):
        return self.kms

    def setCumulativeKms(self, kms):
        self.cumulativeKms = self.cumulativeKms + kms

    def getCumulativeKms(self):
        return self.cumulativeKms

    def addRouteNodes(self, nodes):
        self.routeNodes.append(nodes)

    def getRouteNodes(self):
        return self.routeNodes


firstNode = Node("first")

firstNode.setKms(0)

firstNode.setCumulativeKms(0)

for i in range(10):

    secondNode = Node('new'+str(i))

    secondNode.setKms(10)

    secondNode.setCumulativeKms(10)

    routes = firstNode.getRouteNodes()

    for route in routes:
        secondNode.addRouteNodes(route)

    secondNode.addRouteNodes(firstNode)

print("Done")

1 Ответ

1 голос
/ 12 февраля 2020
class Node:
    kms = 0
    cumulativeKms = 0
    routeNodes = []
    nodeName = ""

Эти переменные не принадлежат каждому созданному новому объекту класса, а скорее разделяются между объектами, и поэтому первый класс добавляется к его собственной переменной routeNodes здесь: secondNode.addRouteNodes(route). Они называются переменными класса.

Решением будет инициализация переменных внутри конструктора, как показано ниже:

self.kms = 0
self.cumulativeKms = 0
self.routeNodes = []
self.nodeName = ""

Они называются переменными экземпляра. Вам это нужно.

Таким образом, обновленный код будет быть:

class Node:

    def __init__(self):
        self.kms = 0
        self.cumulativeKms = 0
        self.routeNodes = []
        self.nodeName = ""

    def setNodeName(self, nodeName):
        self.nodeName = nodeName

    def getNodeName(self):
        return self.nodeName

    def setKms(self, kms):
        self.kms = kms

    def getKms(self):
        return self.kms

    def setCumulativeKms(self, kms):
        self.cumulativeKms = self.cumulativeKms + kms

    def getCumulativeKms(self):
        return self.cumulativeKms

    def addRouteNodes(self, nodes):
        self.routeNodes.append(nodes)

    def getRouteNodes(self):
        return self.routeNodes


firstNode = Node()

firstNode.setNodeName("first")

firstNode.setKms(0)

firstNode.setCumulativeKms(0)

for i in range(10):

    secondNode = Node()

    secondNode.setNodeName('new'+str(i))

    secondNode.setKms(10)

    secondNode.setCumulativeKms(10)

    routes = firstNode.getRouteNodes()

    for route in routes:
        secondNode.addRouteNodes(route)

    secondNode.addRouteNodes(firstNode)

print("Done")
...