【问题标题】:Issue while appending Class Object to a list variable in another instance of the same Class Object将类对象附加到同一类对象的另一个实例中的列表变量时出现问题
【发布时间】:2020-05-27 07:48:41
【问题描述】:

我正在尝试用 Python 编写一个简单的代码。我在 Python 的基础知识方面仍然很薄弱,我被困在这个问题上。我有一个内部类 Node()。它有一个属性 routeNodes 在它是一个列表。我用它来存储同一个类对象(节点())的其他实例。所以我首先初始化 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】:
    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")
    

    【讨论】:

      猜你喜欢
      • 2021-02-05
      • 1970-01-01
      • 2016-01-16
      • 2019-08-15
      • 2020-07-23
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多