我正在尝试用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")
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")