如果在嵌套循环中,数组中的项目不会正确更新

Items in array do not update correctly if in a nested loop

我有以下示例代码:

recs = []
for x in range(1,3):
    rec = {
        'A': x
    }
    recs.append(rec)
    print(rec)
    for y in range(1, 3):
        rec['B'] = y
        recs.append(rec)
        print(rec)

print('----- Array after exiting loops')
for r in recs:
    print(r)

这给出了这个输出:

{'A': 1}
{'A': 1, 'B': 1}
{'A': 1, 'B': 2}
{'A': 2}
{'A': 2, 'B': 1}
{'A': 2, 'B': 2}
----- Array after exiting loops
{'A': 1, 'B': 2}
{'A': 1, 'B': 2}
{'A': 1, 'B': 2}
{'A': 2, 'B': 2}
{'A': 2, 'B': 2}
{'A': 2, 'B': 2}

现在我可以用这段代码解决它:

for y in range(1, 3):
    rec2 = rec.copy()
    rec2['B'] = y
    recs.append(rec2)
    print(rec2)

我正在寻找的是解释为什么当您进入嵌套循环时会出现此行为。

在外部 x 循环中,您正在使用 = 语法创建一个新对象。这个循环只有 运行s 两次,所以你最终只有两个对象。对于通过内部 y 循环的每个 运行,您只是在修改前两个对象之一。

每次更新 rec['B'] 时,您都会覆盖之前对该对象所做的更改。当您将 rec 附加到 recs 时,您并没有创建新对象,您只是告诉列表包含对同一 rec 对象的另一个引用。

如果您在 y 循环中打印 recs 而不仅仅是 rec,您可以实时看到这种情况。