上下文 我想在python之上实现一种语言,该语言需要向现有python对象添加元数据,但是我不想修改所有python对象的基础表示形式。我可以计算并存储每个对象的ID,然后将其用作传统Python字典的键。但这是不可思议的浪费,因为这些ID可以很快从对象本身派生。其他编程语言(Lisp,Java等)具有“身份哈希”,该哈希基于密钥对象的身份进行哈希运算,并调用其哈希函数。
是否可以在Python中做到这一点而无需不从头开始编写自己的哈希值?
答案 0 :(得分:2)
@Paritosh明确地说:只需添加使用id
作为密钥:
mydict[id(myobj)] = myvalue
或ID的哈希值:
mydict[hash(id(myobj))] = myvalue #Note you could just hash(myobj) for many objects.
您可以将其包装在某些类中,但这对我来说似乎是致命的,尽管这取决于您的确切用例。 但这不是真正的哈希图-因此可能会发生冲突并覆盖现有对象。您可以添加逻辑以检查密钥是否存在,然后在其中创建列表:
newhash = hash(id(myobj))
if newhash in mydict: #O(1)
try: mydict[newhash].append(myvalue)
except AttributeError: mydict[newhash] = [mydict[newhash],myvalue]
else: mydict[newhash] = myvalue
,或仅使用defaultdict
。这可能是新班级的更好候选人。
@Patrick提出了一个问题,即您想做的事可能没有任何意义-您将不知道如何引用该对象,而又不知道该对象与id
相关联。如果保留一些添加的ID列表,则可能会有些道理,再次取决于用例。