我最近在Mark 2013的“学习Python 5”中读到,python模块对象是不可变的,因此它们可以用作字典键。

但是假设我有两个文件a.py和b.py,我没有问题将b模块导入a.py,然后通过向b模块对象添加属性来修改b模块。
#a.py file
import b
b.additionalProperty = 'hello'那么python模块对象如何是不可变的,它们如何作为字典键使用呢?
发布于 2018-05-26 00:23:08
对模块对象进行更改(例如在其全局命名空间中添加或修改值)不会更改其哈希值。因此,虽然它不是任何正常定义不变的,但它的“值”用于散列目的是它的标识,这是不可变的。
因此,您确实可以使用模块对象作为字典的键。您还可以使用自定义类的实例,如以下所示:
class Example:
pass # no __hash__ or __eq__ defined
obj = Example()
d = {obj: "this works"}
print(d)
obj.foo = "the attributes of obj don't matter for the hash"
d[obj] = "so this overwrites the previous value in the dict"
print(d)https://stackoverflow.com/questions/50538213
复制相似问题