Python 变量 ID 在将另一个变量定义为自身时导致问题



我正在尝试枚举字典 a 的列表 d 并将它们传输到列表 c。

不工作:

a = {"c": [], "d": [1, 2, 3]}
b = a
for index, value in enumerate(a["d"]):
print(value)
b["c"].append(b["d"].pop(b["d"].index(value)))
print(b)

输出:

1
{'c': [1], 'd': [2, 3]}
3
{'c': [1, 3], 'd': [2]}

加工:

a = {"c": [], "d": [1, 2, 3]}
b = {"c": [], "d": [1, 2, 3]} # <- Changed to the exact same dict
for index, value in enumerate(a["d"]):
print(value)
b["c"].append(b["d"].pop(b["d"].index(value)))
print(b)

输出:

1
{'c': [1], 'd': [2, 3]}
2
{'c': [1, 2], 'd': [3]}
3
{'c': [1, 2, 3], 'd': []}

那么为什么只有第二个有效呢?

您的第一个代码只有一个字典,其地址保存在ab变量中。所以a["c"]b["c"]是同一个列表,a["d"]b["d"]是同一个列表。

然后,您开始迭代列表a["d"]。在第一次迭代中,索引是0,并且您弹出的值1b["d"][0],这与a["d"][0]相同。请注意,现在值2位于索引0中,您将永远不会迭代它。在第二次迭代中,索引是1,然后弹出现在位于索引1中的值3

您的第二个代码有两个独立的字典。它们的地址存储在变量ab中。此外,您有四个独立的列表(a["c"]a["d"]b["c"]b["d"])。您正在迭代a["d"],但您从另一个列表b["d"]弹出项目。因此,当您从b["d"]弹出一个元素时,该元素仍然存在于b["a"]中,并且不会在迭代中进行任何更改。

在第一个代码中,循环迭代2 次以到达列表末尾(因为您要从列表中删除元素),但在第二个代码中,循环迭代 3 次。

a = {"c": [], "d": [1, 2, 3]}
b = {"c": [], "d": [1, 2, 3]} # <- Changed to the exact same dict
a['c'].append(a['d'])
a['d']=[]
print(a)

最新更新