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

时间:2013-05-26 05:54:48

标签: python list hash dictionary

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

d = {}
d[[1,2,3]] = 4

'list' is an unhashable type以来。但是,Python中的id函数返回一个对象的整数,该对象保证对象的生命周期是唯一的。

为什么Python不使用id来散列字典?有缺点吗?

3 个答案:

答案 0 :(得分:12)

原因就在这里(Why must dictionary keys be immutable

  

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

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

         

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

         

    print mydict[[1, 2]]

  •   
     

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

答案 1 :(得分:5)

要求a == bhash(a) == hash(b)。使用id可能会破坏这一点,因为如果您改变列表,ID将不会更改。然后,您可能有两个具有相同内容但具有不同哈希值的列表。

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

答案 2 :(得分:0)

在Python词典中,使用==比较键,并且使用列表的相等运算符执行逐项相等检查,因此具有相同元素的两个不同列表比较相等,并且它们必须表现为相同的键。字典。

如果您需要按标识而不是相等来保留字典或列表集,您可以将列表包装在用户定义的对象中,或者根据上下文,您可以使用存储元素的字典/明确地使用id进行检索。

但请注意,保存对象的id并不意味着对象将保持活动状态,无法从id转到对象,而id可能随着时间的推移可以重复使用垃圾收集的对象。解决方案是使用

my_dict[id(x)] = [x, value]

而不是

my_dict[id(x)] = value