【问题标题】:What the difference between hash-able and immutable? [closed]可散列和不可变之间有什么区别? [关闭]
【发布时间】:2019-10-02 21:56:28
【问题描述】:
  • immutable 和 hash-able 有什么区别?
  • 这是什么意思“如果一个对象的哈希值在其生命周期内永远不会改变,那么它就是可哈希的?”
  • 元组是不可变且可散列的还是仅不可变的?为什么?

【问题讨论】:

标签: python immutability hashable


【解决方案1】:
  1. Hashable 意味着一个对象可以被散列(当与 hash() 函数一起使用时会产生一个值,而 immutable 意味着一个对象不能被“变异”或改变。它们往往一起出现,因为可变参数会是可怕的字典键(每次更改时它们都会更改哈希)
  2. 如果项目具有与hash(item) 关联的永不更改的值,则它是可散列的
  3. 元组既不可变又可散列

【讨论】:

    【解决方案2】:

    散列是一些散列算法对一大块数据的应用;通常是一种将其压缩为可在哈希查找表中搜索的小得多的值的方法。哈希的一些示例包括 MD5SHA-2

    一些哈希在产生冲突时被认为是“失效的”——这意味着两个非常不同的数据会产生相同的“压缩”字符串或整数。 MD5 已失效,因为存在冲突,但大多数 SHA-2 变体没有。

    不变性是确保某些东西不会改变的过程。例如,想象一个 C 程序的静态二进制文件。一旦将其发布到万维网或最终用户,您不希望其内容发生变化,因此您希望它是不可变的。

    这与散列有关。一旦你“散列”了一个对象,你就不想改变它的内容,否则你会得到一个不同的散列。如果你改变了内容并且哈希没有改变,那么你就有冲突了!

    元组只是一种数据结构,应该是不可变的和可散列的。如果您在执行此操作时遇到问题,则可能是代码问题。

    【讨论】:

      【解决方案3】:
      1. Immutable 表示对象,即项目的顶级容器,不能更改。请注意,这应用于顶层;它可能包含对可变子对象的引用。

      2. Hashable 有一个函数定义:Python 内置的hash 函数返回一个值。这通常意味着对象的闭包(在所有对其叶节点值的引用之后)由不可变对象组成。

      3. 您的前提不正确:元组可以包含可变项。任何此类引用都会使元组无法散列。

      例如:

      >>> b = [7]
      >>> a = (b, 5)
      >>> a
      ([7], 5)
      >>> type(a)
      <class 'tuple'>
      >>> set(a)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: unhashable type: 'list'
      >>> b[0] = 'b'
      >>> a
      (['b'], 5)
      

      b 是一个可变列表。对b引用 可以保存在元组a 中。我们可以改变b[0] 的值(不是它是对象句柄),a 的显示值也会改变。但是,我们不能创建包含a 的集合,因为b 的可变性导致a 无法散列。

      继续举例:

      >>> b = False
      >>> a
      (['b'], 5)
      >>> b = [14]
      >>> a
      (['b'], 5)
      

      a 是不可变的。因此,当我们更改b 时,只有b 获得对新对象的引用。 a 保留原来的对象句柄,仍然指向['b']

      【讨论】:

        猜你喜欢
        • 2011-10-27
        • 1970-01-01
        • 2010-09-18
        • 2014-10-02
        • 2013-12-30
        • 1970-01-01
        • 2013-12-11
        • 2014-02-13
        • 2021-03-29
        相关资源
        最近更新 更多