我最近在学习Python第5版中阅读了Mark Lutz 2013 ,python模块对象是不可变的,因此它们可以用作字典键。
但是说我有两个文件a.py
和b.py
,我可以将b
模块导入a.py
,然后通过添加修改b
模块属性b
模块对象。
#a.py file
import b
b.additionalProperty = 'hello'
那么python模块对象如何是不可变的以及如何将它们用作字典键?
答案 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)