【问题标题】:Python list of classes issuePython类列表问题
【发布时间】:2012-03-11 01:48:48
【问题描述】:

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

【问题讨论】:

    标签: python list class


    【解决方案1】:
    nodeTable.append(Node)
    

    问题在于那一行。您在那里所做的是将 type(或 class)附加到列表中。因此,您最终会得到一个包含 完全相同类型引用七倍的列表。

    您应该做的是创建所述类型的实例。你可以通过调用它来做到这一点。

    nodeTable.append(Node())
    

    【讨论】:

      【解决方案2】:

      不应该

      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】:

        在这段代码中,您将在每次迭代中附加完全相同的对象,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]
        

        【讨论】:

          【解决方案4】:

          正如其他人所说,在这里列出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 的值。然而,这不太可能是一个非常明智的设计。

          【讨论】:

            猜你喜欢
            • 2011-12-16
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 2020-09-29
            • 2013-01-07
            • 2013-09-04
            • 2011-01-11
            相关资源
            最近更新 更多