所以我听说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 在设置新值时会检查字典中是否已存在某个键。但是,此检查发生在 C 级别,而不是像问题中所示的 Python 代码。检查由_Py_dict_lookup
完成。有充分的理由必须检查密钥是否存在:
如果我们要替换某个键,则旧值的引用计数必须递减。