为什么这个简单的 Python 代码会产生一个空字典?
from collections import defaultdict
dict1 = defaultdict(list)
dict1['old_key'] = [{'name': 'A'}]
dict1['old_key'].extend(dict1.pop('old_key'))
print(dict1)
我对这应该如何运作的理解:
pop 方法将返回与
old_key
关联的列表,该列表将传递给extend 方法。
扩展方法会再次设置old_key
;因为它现在不存在,所以它将使用一个空列表对其进行初始化,并使用从 pop 方法接收到的列表扩展该空列表。
所以这应该导致
{'old_key': [{'name': 'A'}]}
,但我得到的是:{}
实际代码的上下文:
在我的实际代码中,我需要更改字典的键,因此我弹出旧键的值并用这些值扩展新键。
但是,有时,基于某些条件生成的新密钥与旧密钥相同,并且扩展和弹出在同一行的代码表现得很奇怪。
当然,我可以通过分成两行来修复它:首先弹出并将结果存储在一个值中,然后扩展。
或者,在设置新密钥之前,我可以检查新密钥是否已在字典中或与弹出的密钥相同。
但我想了解是什么导致了代码的奇怪行为。
输出将是一个空字典,因为与键“old_key”关联的列表已被移动到新键“old_key”,然后原始键“old_key”被删除。因此,经过这些操作,dict1将是一个空字典。
pop方法将返回与old_key关联的列表,该列表将被传递给extend方法。 extend方法会再次设置old_key;因为它现在不存在,所以它将使用一个空列表对其进行初始化,并使用从 pop 方法接收到的列表扩展该空列表。
代码不是这样执行的。 Python一般严格从左到右执行,所以求值的顺序是:
dict1
'old_key'
extend
dict1
pop
pop
extend
所以
extend
正在 dict['old_key']
上运行,随后从字典中弹出,创建一个循环列表,然后将其扔到地上。