为什么这个简单的Python代码会产生一个空字典?

问题描述 投票:0回答:2

为什么这个简单的 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'}]}
,但我得到的是:
{}

实际代码的上下文:

在我的实际代码中,我需要更改字典的键,因此我弹出旧键的值并用这些值扩展新键。

但是,有时,基于某些条件生成的新密钥与旧密钥相同,并且扩展和弹出在同一行的代码表现得很奇怪。

当然,我可以通过分成两行来修复它:首先弹出并将结果存储在一个值中,然后扩展。

或者,在设置新密钥之前,我可以检查新密钥是否已在字典中或与弹出的密钥相同。

但我想了解是什么导致了代码的奇怪行为。

python
2个回答
0
投票

输出将是一个空字典,因为与键“old_key”关联的列表已被移动到新键“old_key”,然后原始键“old_key”被删除。因此,经过这些操作,dict1将是一个空字典。


0
投票

pop方法将返回与old_key关联的列表,该列表将被传递给extend方法。 extend方法会再次设置old_key;因为它现在不存在,所以它将使用一个空列表对其进行初始化,并使用从 pop 方法接收到的列表扩展该空列表。

代码不是这样执行的。 Python一般严格从左到右执行,所以求值的顺序是:

  • 加载
    dict1
  • 获取物品
    'old_key'
  • 获取属性
    extend
  • 加载
    dict1
  • 加载属性
    pop
  • 执行方法
    pop
  • 执行方法
    extend

所以

extend
正在
dict['old_key']
上运行,随后从字典中弹出,创建一个循环列表,然后将其扔到地上。

© www.soinside.com 2019 - 2024. All rights reserved.