Python类列表问题

Python类列表问题,python,list,class,Python,List,Class,我遇到了一些Python的问题。我有一个列表,其中有一个类的七个副本,我打算只更改其中一个类的值,但每当我这样做时,所有类的值都会更改 下面是课堂: class Node: previous = -1 distFromSrc = 1000000 visited = False 下面是我创建列表的方式: def createNodeTable(network): nodeTable = [] for line in network: nodeTable.append(

我遇到了一些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].visted”时,每个值都会显示为“False”

但是,如果我调用以下函数,“.visited”的所有值都将更改为false,而不仅仅是我要更改的值

无论“currentNode”更改为什么,我都会遇到相同的问题:

def setVisited(currentNode, nodeTable):
  nodeTable[currentNode].visited = True
  return nodeTable

setVisited函数是否存在问题,或者是否与nodeTable有关?我甚至不知道从哪里开始尝试解决这个问题。

在这段代码中,您在每次迭代中都添加了完全相同的对象,类
节点

def createNodeTable(network):
  nodeTable = []
  for line in network:
    nodeTable.append(Node)
  return nodeTable
因为它是完全相同的对象,更改它会更改它

我们假定您想用
nodeTable.append(Node())
替换
nodeTable.append(Node())

当您使用时,切换到新样式的类(假设这是Python2)

顺便说一句,您可以这样做:

def createNodeTable(network):
    return [Node() for line in network]
问题就在这一行。您要做的是将类型(或类)附加到列表中。因此,最终得到的列表是完全相同类型引用的七倍

您应该做的是创建所述类型的实例。你可以打电话给它

nodeTable.append(Node())
不应该

def createNodeTable(network):
    nodeTable = []
    for line in network:
        nodeTable.append(Node)
   return nodeTable
是:


您希望将7个不同的实例附加到nodeTable,而不是同一个类对象7次。

正如其他人所说,在此处列出
节点的实例可能更有意义。如果您确实想要一个单独类的列表,可以使用类工厂:

def make_node_class():
    class Node:
        previous = -1
        distFromSrc = 1000000
        visited = False
    return Node

node_table = [make_node_class() for line in network]
node\u table
的每个元素现在都是一个完全独立的类,设置
node\u table[0]。visited=True
不会影响
node\u table[1]的值。visited
。然而,这不太可能是一个非常明智的设计

def createNodeTable(network):
    nodeTable = []
    for line in network:
        nodeTable.append(Node())
    return nodeTable
def make_node_class():
    class Node:
        previous = -1
        distFromSrc = 1000000
        visited = False
    return Node

node_table = [make_node_class() for line in network]