如果在嵌套循环中,数组中的项目不会正确更新
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
,您可以实时看到这种情况。
我有以下示例代码:
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
,您可以实时看到这种情况。