模块对象不可变,可以用作字典键

时间:2018-05-26 00:11:45

标签: python dictionary module immutability

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

enter image description here

但是说我有两个文件a.pyb.py,我可以将b模块导入a.py,然后通过添加修改b模块属性b模块对象。

#a.py file 

import b
b.additionalProperty = 'hello'

那么python模块对象如何是不可变的以及如何将它们用作字典键?

1 个答案:

答案 0 :(得分:3)

对模块对象进行更改(例如在其全局命名空间中添加或修改值)不会更改其哈希值。因此,虽然它不是任何正常定义的不可改变的,但它的价值和#34;用于散列目的的是其标识, 不可变。

因此,您确实可以将模块对象用作字典的键。您还可以使用自定义类的实例,例如:

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)