Python 如何创建基于通用身份的哈希dict?

Python 如何创建基于通用身份的哈希dict?,python,dictionary,identity,Python,Dictionary,Identity,上下文 我想在python之上实现一种语言,在这种语言中,我需要向现有python对象添加元数据,但我不想修改所有python对象的底层表示。我可以计算并存储每个对象的id,然后用作传统Python dict的键。但这是一种难以置信的浪费,因为这些id可以很快从对象本身派生出来。其他编程语言(Lisp、Java等)有一个“标识散列”,它根据键对象的标识进行散列,并调用其散列函数 我可以在Python中这样做而不必从头开始编写自己的哈希吗?@Paritosh直截了当地说:只需添加并使用id作为键:

上下文 我想在python之上实现一种语言,在这种语言中,我需要向现有python对象添加元数据,但我不想修改所有python对象的底层表示。我可以计算并存储每个对象的id,然后用作传统Python dict的键。但这是一种难以置信的浪费,因为这些id可以很快从对象本身派生出来。其他编程语言(Lisp、Java等)有一个“标识散列”,它根据键对象的标识进行散列,并调用其散列函数


我可以在Python中这样做而不必从头开始编写自己的哈希吗?

@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
作为键,只使用
id
作为键并让字典像往常一样在内部工作有什么错?如果您使用
id(项)
作为键。。。我想从字典里拿到物品。。。而且没有……你怎么才能得到它的身份?如果您已经有了
。。。为什么要获取其
id(item)
以从dict中检索它。。。。。。。。。。。。。。。。。。。。。。。。。。。。你已经有了它-不需要检索…你想要一个带有任意键的真实地图,而不仅仅是字符串键?你是否将这些id存储在某个地方?我这样问是因为我认为@Patrick有一个非常正确的观点。还要注意的是,你所说的“所有对象都有一个唯一的id”并不是完全正确的。例如,两个具有相同内容的字符串可能具有相同的id,因为该值已被“插入”(请参阅)。如何在没有对象的情况下从dict中检索该值?@PatrickArtner这是什么意思?就像用键从字典中检索任何内容一样。但是如果没有对象,如何获取其id()?如何在不知道键是什么的情况下从任何字典中检索值?这与你的担忧有什么关系?@PatrickArtner我试图在编辑中解决你的担忧。如果你同意,请告诉我。