将类对象附加到同一类对象的另一个实例中的列表变量时出现的问题

问题描述 投票:0回答:1

我正在尝试用Python编写一个简单的代码。我对Python的基础知识仍然很弱,因此我一直坚持这个问题。我有一个内部的类Node()。它具有一个属性routeNodes,它是一个列表。我用它来存储相同的类Object(Node())的其他实例。因此,我首先初始化Class firstNode并为其提供一些虚拟值。

然后我运行一个for循环10次迭代。在每个迭代中,我都创建同一Node()类的另一个实例。然后,我将firstNode对象(再次是Node()的实例)附加到每个secondNode类中。

它将firstNode添加到secondeNode的routeNode列表变量。

但是它也会将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")
python-3.x list class append inner-classes
1个回答
0
投票
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")
© www.soinside.com 2019 - 2024. All rights reserved.