>> {{}} # empty dict of empty dict Traceback (-6ren">
gpt4 book ai didi

python - "TypeError: unhashable type"在 dict/set 中查找不可散列对象期间

转载 作者:行者123 更新时间:2023-12-01 01:11:25 29 4
gpt4 key购买 nike

前言

据我了解dict s/set仅由于其实现,才应使用可哈希对象创建/更新 s,因此当此类代码失败时

>>> {{}}  # empty dict of empty dict
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'dict'

没关系,我已经看到很多这样的消息了。

但是如果我想检查set中是否有一些不可散列的对象/dict

>>> {} in {}  # empty dict not in empty dict

我也遇到错误

Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: unhashable type: 'dict'

问题

这种行为背后的理由是什么?我知道查找和更新可能在逻辑上相连(如 dict.setdefault method ),但它不应该在修改步骤而不是查找上失败吗?也许我有一些可散列的“特殊”值,我以某种方式处理,但其他值(可能是不可散列的)——在另一个中:

SPECIAL_CASES = frozenset(range(10)) | frozenset(range(100, 200))
...
def process_json(obj):
if obj in SPECIAL_CASES:
... # handle special cases
else:
... # do something else

因此,对于给定的查找行为,我被迫使用其中一个选项

  • LBYL方式:检查是否obj是可散列的,并且仅在检查它是否是 SPECIAL_CASES 之一之后(这不是很好,因为它基于 SPECIAL_CASES 结构和查找机制限制,但可以封装在单独的谓词中),
  • EAFP方式:使用某种实用程序进行“安全查找”,例如

    def safe_contains(dict_or_set, obj):
    try:
    return obj in dict_or_set
    except TypeError:
    return False
  • 使用list/tuple对于 SPECIAL_CASES (这不是查找时的 O(1))。

或者我错过了一些微不足道的事情?

最佳答案

正如您毫无疑问地意识到的那样,集合和字典的内部工作原理非常相似。基本上,这个概念是你有键值对(或者只是带有一组的键),并且键必须永远不会改变(不可变)。如果对象是可变的,则哈希将失去其作为基础数据的唯一标识符的含义。如果您无法判断一个对象是否唯一,则一组唯一键的含义就会失去其唯一性的关键属性。这就是为什么可变类型不允许出现在集合中以及作为字典的键。以您的示例为例: {} in {} #empty dict not in empty dict 我认为您有一个轻微的误解,因为 dict.__contains__ 仅检查字典的键,不是值(value)观。由于你永远不能将字典作为键(因为它是可变的),所以这是无效的。

关于python - "TypeError: unhashable type"在 dict/set 中查找不可散列对象期间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830602/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com