在正式Python文档的Glossary-Page部分下面的"hashable"上,访问者可以阅读
如果对象的哈希值在其生存期内从未更改,则该对象是可哈希的。。。
Python的所有不可变的内置对象都是散列的,而没有可变的容器(如列表或字典)不是。。。
这意味着传递
intfloatlongcomplex
str
bytes
tuple
frozenset
类必须返回假定的哈希值。
问题是元组可以包含不可分解的对象(例如hash()s),因此有些元组是不可哈希的:
创建(有效)元组,该元组由可散列(lists和int)和不可散列(string)数据类型组成。

>>> tuple([1, 2, [3, "4"]])
    (1, 2, [3, '4'])

散列这个元组失败。。。
>>> hash((1, 2, [3, '4']))
    Traceback (most recent call last):
        hash((1, 2, [3, '4']))
    TypeError: unhashable type: 'list'

... 尽管要散列的对象是不可变的内置类型
>>> type((1, 2, [3, '4']))
    <class 'tuple'>

那么,为什么Python文档现在声明“所有不可变的内置对象都是散列的”,尽管特别是list类型可以包含不可更改的类型?

最佳答案

我对Python的散列不太了解,但对我来说,你好像只是在挑剔文本。
所有Python的不可变内置对象都是散列的
这就是他们所说的,这是真的:你可以散列一个元组,比如(3, 3, 2)很好,元组是散列的。
但是,如果将不可更改列表放入元组,则无法再对其进行哈希处理,因为它包含不可更改对象。这并不意味着元组是不可更改的,但是列表是不可更改的,因此包含列表的元组不能再被散列。
将不可堆肥垃圾放入可堆肥垃圾袋中不会使垃圾袋不可堆肥。

关于python - 为什么Python Docs声明“所有不可变的内置对象都是可哈希的”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32868211/

10-12 14:02