在Python中使用字典时,以下是不可能的:
d = {}
d[[1,2,3]] = 4
自'list' is an unhashable type
以来。但是,Python中的id
函数返回一个对象的整数,该对象保证对象的生命周期是唯一的。
为什么Python不使用id
来散列字典?有缺点吗?
答案 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 == b
,hash(a) == hash(b)
。使用id
可能会破坏这一点,因为如果您改变列表,ID将不会更改。然后,您可能有两个具有相同内容但具有不同哈希值的列表。
另一种看待它的方法是,是的,你可以做到,但这意味着你无法用另一个具有相同内容的列表来检索dict值。您只能使用与密钥完全相同的列表对象来检索它。
答案 2 :(得分:0)
在Python词典中,使用==
比较键,并且使用列表的相等运算符执行逐项相等检查,因此具有相同元素的两个不同列表比较相等,并且它们必须表现为相同的键。字典。
如果您需要按标识而不是相等来保留字典或列表集,您可以将列表包装在用户定义的对象中,或者根据上下文,您可以使用存储元素的字典/明确地使用id
进行检索。
但请注意,保存对象的id
并不意味着对象将保持活动状态,无法从id
转到对象,而id
可能随着时间的推移可以重复使用垃圾收集的对象。解决方案是使用
my_dict[id(x)] = [x, value]
而不是
my_dict[id(x)] = value