提问人:ZenPyro 提问时间:11/12/2023 更新时间:11/12/2023 访问量:108
为什么 Python 中的字典会在赋值期间检查是否存在密钥?
Why do dictionaries in Python check for a key-existing during assignment?
问:
所以我听说 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 代码中。检查由 CPython 中_Py_dict_lookup
的帮助程序函数完成。
实现必须检查密钥是否已存在,这是有充分理由的:
- 替换密钥时,必须递减旧值的引用计数(无内存泄漏)
- 替换密钥时,CPython 保证不会触发后备存储大小调整(用户可以在字典迭代期间修改项目)。
- 为了区分“密钥存在”和“哈希冲突”,可能需要在新密钥和旧密钥之间进行相等检查(冲突处理)
在编写 Python 代码时,您不需要进行这种检查。使用类似的东西会更正常:
dictionary[key] = dictionary.get(key, 0) + 1
或者,如果您只是计算键,请使用 dict 子类,例如集合。相反,计数器
。
评论
上一个:如何制作三叶草图像
评论
dict
PyDict_SetItem