将 Class 对象附加到同一 Class 对象的另一个实例中的列表变量时出现问题
Issue while appending Class Object to a list variable in another instance of the same Class Object
我正在尝试在 Python 中编写一个简单的代码。我在 Python 的基础知识方面仍然很薄弱,而且我一直被这个问题所困扰。我有一个内部 Class Node()。它有一个属性 routeNodes,它是一个列表。我用它来存储相同 Class 对象(节点())的其他实例。所以我首先初始化 Class firstNode 并给它一些虚拟值。
然后我 运行 一个 for 循环 10 次迭代。在每次迭代中,我都创建了同一个 Node() class 的另一个实例。然后,我将 firstNode 对象(它又是 Node() 的一个实例)附加到这些 secondNode classes 中的每一个。
将firstNode添加到secondeNode的routeNode列表变量中。
但它也将 firstnode 对象添加到它自己的 class 对象的 routenode 列表变量中!
相同的 firstNode 对象被附加到两个 class 对象。为什么会这样?我不能像这样添加 class 个对象吗?我该如何阻止它发生?
附上我的代码。您可以 运行 测试 class 并调试 "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 = ""
这些变量不属于创建的每个新 class 对象,而是在对象之间共享,因此第一个 class 在这里附加到它自己的 routeNodes 变量:secondNode.addRouteNodes(route)
。它们被称为 class 个变量。
一个解决方案是在构造函数中初始化变量,如下所示:
self.kms = 0
self.cumulativeKms = 0
self.routeNodes = []
self.nodeName = ""
这些被称为实例variables.You需要这个。
因此更新后的代码将是:
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")
我正在尝试在 Python 中编写一个简单的代码。我在 Python 的基础知识方面仍然很薄弱,而且我一直被这个问题所困扰。我有一个内部 Class Node()。它有一个属性 routeNodes,它是一个列表。我用它来存储相同 Class 对象(节点())的其他实例。所以我首先初始化 Class firstNode 并给它一些虚拟值。
然后我 运行 一个 for 循环 10 次迭代。在每次迭代中,我都创建了同一个 Node() class 的另一个实例。然后,我将 firstNode 对象(它又是 Node() 的一个实例)附加到这些 secondNode classes 中的每一个。
将firstNode添加到secondeNode的routeNode列表变量中。
但它也将 firstnode 对象添加到它自己的 class 对象的 routenode 列表变量中!
相同的 firstNode 对象被附加到两个 class 对象。为什么会这样?我不能像这样添加 class 个对象吗?我该如何阻止它发生?
附上我的代码。您可以 运行 测试 class 并调试 "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 = ""
这些变量不属于创建的每个新 class 对象,而是在对象之间共享,因此第一个 class 在这里附加到它自己的 routeNodes 变量:secondNode.addRouteNodes(route)
。它们被称为 class 个变量。
一个解决方案是在构造函数中初始化变量,如下所示:
self.kms = 0
self.cumulativeKms = 0
self.routeNodes = []
self.nodeName = ""
这些被称为实例variables.You需要这个。
因此更新后的代码将是:
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")