Python列表问题

时间:2012-02-20 17:51:03

标签: python list class

我遇到了一些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有关?我甚至不知道从哪里开始尝试解决这个问题。

4 个答案:

答案 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的值。然而,这不太可能是一个非常明智的设计。