我正在尝试枚举字典 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': []}
那么为什么只有第二个有效呢?
您的第一个代码只有一个字典,其地址保存在a
和b
变量中。所以a["c"]
和b["c"]
是同一个列表,a["d"]
和b["d"]
是同一个列表。
然后,您开始迭代列表a["d"]
。在第一次迭代中,索引是0
,并且您弹出的值1
为b["d"][0]
,这与a["d"][0]
相同。请注意,现在值2
位于索引0
中,您将永远不会迭代它。在第二次迭代中,索引是1
,然后弹出现在位于索引1
中的值3
。
您的第二个代码有两个独立的字典。它们的地址存储在变量a
和b
中。此外,您有四个独立的列表(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)