【发布时间】: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)
程序是这样的:
- 创建 Table 对象时,它会自动尝试使用 initRows() 函数创建一个 9 长的 Row 对象列表。
- 在 initRows() 函数中,我们只需创建一个 Row 类的临时对象,然后立即将其 append() 添加到 行 列表。
- 当我们创建 Row 对象时,它只存储数独表给定行的给定数字。
- 如果我在创建每个临时 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]
- 但是当我尝试 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