为什么不使用ID的Python哈希列表?

sda*_*das 6 python hash dictionary list

在Python中使用字典时,以下是不可能的:

d = {}
d[[1,2,3]] = 4
Run Code Online (Sandbox Code Playgroud)

自从'list' is an unhashable type.但是,idPython中的函数返回一个对象的整数,该对象保证对象的生命周期是唯一的.

为什么Python不使用id哈希字典呢?有缺点吗?

jam*_*lak 12

原因就在这里(为什么字典键必须是不可变的)

已经提出了一些不可接受的解决方案:

  • 哈希按其地址(对象ID)列出.这不起作用,因为如果你构造一个具有相同值的新列表,它将无法找到; 例如:

    mydict = {[1, 2]: '12'}

    print mydict[[1, 2]]

会引发KeyError异常,因为[1, 2]第二行中使用的id 与第一行中的id 不同.换句话说,应该使用==而不是使用来比较字典键is.


Bre*_*arn 5

这是一个要求,如果a == b,那么hash(a) == hash(b).使用id可以打破这个,因为如果你改变列表,ID不会改变.然后,您可能有两个具有相同内容但具有不同哈希值的列表.

另一种看待它的方法是,是的,你可以这样做,但这意味着你无法用另一个具有相同内容的列表来检索dict值.您只能使用与键完全相同的列表对象来检索它.