理解什么样的对象可以是字典键

Understanding what sort of objects can be dictionary keys

我正在与一位 SO 用户进行讨论,我们试图确定 Python 模块是否保存在变量中——例如,sys , 以下 import sys -- 是可变的或不可变的。

有没有人有好的答案?

这个问题源于关于哪种对象可以作为 Python dicts 的键的讨论。 Python docs 声称 "only immutable elements can be used as dictionary keys, and hence only tuples and not lists can be used as keys." 但是模块——作为可变对象的一个​​例子——可以用作键,如

x = {sys: 1}

它是可变的。你可以这样做:

>>> import sys
>>> sys.blah = 100
>>> sys.blah
100

The Python docs claim that "only immutable elements can be used as dictionary keys, and hence only tuples and not lists can be used as keys." But a module -- as just one example of a mutable object -- can be used as a key

事物必须是不可变的才能用作字典键,这并不完全正确。相反,考虑用于 == 比较的关于它们的一切都必须是不可变的。 == for modules works by object identity,所以做一些像

import sys
sys.foo = 3

不会更改用于 == 比较的任何信息。因此,它们可以用作字典键。