【问题标题】:Append is overwriting existing data in list of classes追加正在覆盖类列表中的现有数据
【发布时间】:2020-05-28 20:53:18
【问题描述】:

我正在用 Python 制作数独求解程序。

我有一个、一个内部类、一个列表构造函数和一个函数 这将使 Row 对象的 list

    class Table:

       rows = []

       def __init__(self):
          initRows()

       class Row:

          numbers = []

          def __init__(self):
             "stuff that stores a list of integers in **numbers** list"

       def initRows(self, numbers):
          for i in range(9):
             temp_row = self.Row(i, numbers)
             self.rows.append(temp_row)

程序是这样的:

  1. 创建 Table 对象时,它会自动尝试使用 initRows() 函数创建一个 9 长的 Row 对象列表。
  2. initRows() 函数中,我们只需创建一个 Row 类的临时对象,然后立即将其 append() 添加到 列表。
  3. 当我们创建 Row 对象时,它只存储数独表给定行的给定数字。
  4. 如果我在创建每个临时 Row 对象后 print() numbers 列表,那么它会给出正确的值。李>
[0, 0, 0, 7, 4, 0, 0, 0, 6]
[4, 0, 6, 8, 0, 0, 5, 0, 7]
[7, 0, 0, 0, 9, 0, 0, 0, 4]
[0, 3, 0, 9, 8, 4, 7, 0, 0]
[8, 2, 0, 6, 1, 3, 4, 0, 9]
[0, 4, 0, 0, 0, 0, 3, 0, 0]
[0, 6, 2, 3, 7, 0, 0, 0, 5]
[0, 0, 5, 4, 0, 9, 0, 0, 0]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
  1. 但是当我尝试 print()for 循环 循环一次或多次之后或在初始化之后每个 Row 对象的值完成,则列表仅填充最后一个 Row 对象
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]
[0, 7, 0, 0, 6, 1, 2, 0, 8]

我在互联网上搜索了 小时,发现人们对列表类的 append() 函数有问题,但没有任何帮助。

所以我的问题是:我怎样才能做到这一点?

(如果需要任何其他信息/部分代码:问吧!)

【问题讨论】:

  • 您可能正在为每一行添加对相同“数字”列表的引用,这就是为什么它们最终都相同的原因。尝试类似 numbers.copy() 看看它是否有任何不同
  • @NewPythonUser 这不是问题。正如我在第四点中提到的,它们的价值是不同的。它们是 for 循环完成 1 次迭代之前的正确值。但是在 for 循环跳转到下一次迭代之后,self.rows.append() 函数会覆盖列表中的所有其他条目,正如我在第 5 点中提到的那样。 (顺便说一句,我试过了,没有任何区别)
  • 那从你给出的例子很难判断。但由于所有行的值都相同,因此很可能它们都指向同一个列表(通过引用)
  • 另一个建议。将类属性更改为实例属性。尤其是 Row 类下的“数字”属性。在此处查看更多信息:dzone.com/articles/…
  • @NewPythonUser 当我打印值时,它很简单:for i in range(9): print(self.rows[i].numbers)

标签: python python-3.x append inner-classes


【解决方案1】:

事实证明,在 Row 类中,numbers 列表是一个 class 属性(意味着它在Row 类的所有对象)而不是 instance 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2012-11-11
    • 2011-07-29
    • 2017-05-15
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多