为什么 Python 中的字典在赋值期间要检查是否存在键?

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

所以我听说Python中的

dict
实例会在分配值之前检查键是否已经存在。这对我来说似乎非常多余,我将用一个例子来解释原因。
示例:

if(key in dictionary):
   dictionary[key] = dictionary[key] + 1
else:
   dictionary[key] = 1

因此您可以在这个示例中看到,无需检查

dictionary[key] = dictionary[key] + 1
的密钥是否已存在。因为赋值右侧的
dictionary[key]
(
dictionary[key] + 1
) 将检索键(如果存在),或者如果键不存在于
KeyError
实例中,则引发
dict
(请注意,检查该键是否出现在右侧(与分配无关)。无论左侧的检查中是否已存在密钥 (
dictionary[key] =
),都不会对结果产生任何影响。如果没有进行检查,并且您只是计算了
key
的哈希值并将其分配给
value
。密钥以前是否存在并不重要。 另请注意: 无论有或没有
if(key in dictionary):
,都将执行冗余检查。

对于示例的第二部分

dictionary[key] = 1
dictionary[key]
检查中是否存在密钥不会改变结果,之前
key
的值(如果存在)将被
1
覆盖。那么组前检查的意义何在。

也许在设置之前的 ASSIGNMENT 期间进行隐式检查是有原因的。如果检查是针对作业左侧或右侧的

dict
实例,则似乎会执行单独的检查。因为丢失的
key
不会在左侧抛出
KeyError
,所以会生成一个新的
key
。我看不到在比赛前需要进行检查的例子,但如果你这样做的话!我很想听。

python dictionary variable-assignment order-of-execution
1个回答
0
投票

确实如此,Python 在设置新值时会检查字典中是否已存在某个键。但是,此检查发生在 C 级别,而不是像问题中所示的 Python 代码。检查由_Py_dict_lookup

完成。
有充分的理由必须检查密钥是否存在:

如果我们要替换某个键,则旧值的引用计数必须递减。
  • 如果我们要替换密钥,CPython 保证不会触发后备存储大小调整。
© www.soinside.com 2019 - 2024. All rights reserved.