我遇到了一些Python的问题。我有一个列表,有一个类的七个副本,我打算只改变其中一个的值,但每当我这样做时,它改变了所有的值。
这是班级:
class Node:
previous = -1
distFromSrc = 1000000
visited = False
以下是我创建列表的方法:
def createNodeTable(network):
nodeTable = []
for line in network:
nodeTable.append(Node)
return nodeTable
'network'是一个长度为7的列表,所以当我在尝试对值进行任何更改之前打印'nodeTable [x] .visited'时,每个都会得到'False'。
如果我调用以下函数,但所有'.visited'值都会变为false,而不仅仅是我打算更改的值。
无论'currentNode'改变为什么,我都会遇到同样的问题:
def setVisited(currentNode, nodeTable):
nodeTable[currentNode].visited = True
return nodeTable
setVisited函数是否存在问题,还是与nodeTable有关?我甚至不知道从哪里开始尝试解决这个问题。
答案 0 :(得分:4)
nodeTable.append(Node)
问题出在那条线上。您正在做的是将类型(或类)附加到列表中。因此,您最终得到的是完全相同的类型引用的七倍列表。
您应该做的是创建所述类型的实例。你可以通过调用它来做到这一点。
nodeTable.append(Node())
答案 1 :(得分:2)
在此代码中,您将在每次迭代中追加完全相同的对象,即类Node
:
def createNodeTable(network):
nodeTable = []
for line in network:
nodeTable.append(Node)
return nodeTable
因为它是完全相同的对象,所以更改它会改变它。
有人假设您要将nodeTable.append(Node)
替换为nodeTable.append(Node())
当你在它的时候,切换到新式的类(假设这是Python 2)。
顺便说一下,你可以这样做:
def createNodeTable(network):
return [Node() for line in network]
答案 2 :(得分:2)
should't
def createNodeTable(network):
nodeTable = []
for line in network:
nodeTable.append(Node)
return nodeTable
是:
def createNodeTable(network):
nodeTable = []
for line in network:
nodeTable.append(Node())
return nodeTable
您希望将7个不同的实例附加到nodeTable,而不是相同的类对象7次。
答案 3 :(得分:1)
正如其他人所说,在这里列出Node
的实例可能更有意义。如果你真的想要一个单独的类列表,你可以使用类工厂:
def make_node_class():
class Node:
previous = -1
distFromSrc = 1000000
visited = False
return Node
node_table = [make_node_class() for line in network]
node_table
的每个元素现在都是一个完全独立的类,设置node_table[0].visited = True
不会影响node_table[1].visited
的值。然而,这不太可能是一个非常明智的设计。