可哈希和不可变之间有什么区别?
What the difference between hash-able and immutable?
- 不可变和可散列的区别是什么?
- 这是什么意思"An object is hashable if it has a hash value which never changes during its lifetime?"
- 元组是不可变且可散列的还是仅不可变的?为什么?
- Hashable 表示一个对象可以被哈希(与
hash()
函数一起使用时会产生一个值,而immutable 表示一个对象不能"mutated"或改变。他们倾向于去在一起,因为可变参数将是可怕的字典键(每次更改时它们都会更改它们的散列)
- 如果某项具有与
hash(item)
关联的 never-changing 值,则它是可哈希的
- 元组既不可变又可散列
散列是将某种散列算法应用于一大块数据;通常以一种将其压缩为可在散列 look-up table 中搜索的更小值的方式。散列的一些示例包括 MD5 and SHA-2.
一些散列在产生冲突时被视为 "defunct" - 意思是,两个截然不同的数据产生相同的 "compressed" 字符串或整数。 MD5 已失效,因为存在冲突,但大多数 SHA-2 变体不是。
不变性是确保某些东西不会改变的过程。例如,想象一个 C-program 的静态二进制文件。一旦将其发布到万维网或最终用户,您不希望其内容发生变化,因此您希望它是 immutable.
这与哈希相关。一旦你 "hash" 一个对象,你不希望它的内容改变,否则你会得到一个不同的散列。如果你改变了内容而哈希没有改变,那么你就有了冲突!
元组只是一种数据结构,应该既是 immutable 又是可散列的。如果您这样做时遇到问题,可能是代码问题。
Immutable表示对象,即item的top-level容器,不能改变。请注意,这仅适用于 到顶层;它可能包含对可变的 sub-objects 的引用。
Hashable有一个函数定义:Python的built-inhash
函数returns一个价值。这通常意味着对象的闭包(在所有对其 leaf-node 值的引用之后)由不可变对象组成。
您的前提不正确:元组 可以 包含可变项。任何此类引用都会呈现元组 un-hashable.
例如:
>>> 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']
.
- 不可变和可散列的区别是什么?
- 这是什么意思"An object is hashable if it has a hash value which never changes during its lifetime?"
- 元组是不可变且可散列的还是仅不可变的?为什么?
- Hashable 表示一个对象可以被哈希(与
hash()
函数一起使用时会产生一个值,而immutable 表示一个对象不能"mutated"或改变。他们倾向于去在一起,因为可变参数将是可怕的字典键(每次更改时它们都会更改它们的散列) - 如果某项具有与
hash(item)
关联的 never-changing 值,则它是可哈希的 - 元组既不可变又可散列
散列是将某种散列算法应用于一大块数据;通常以一种将其压缩为可在散列 look-up table 中搜索的更小值的方式。散列的一些示例包括 MD5 and SHA-2.
一些散列在产生冲突时被视为 "defunct" - 意思是,两个截然不同的数据产生相同的 "compressed" 字符串或整数。 MD5 已失效,因为存在冲突,但大多数 SHA-2 变体不是。
不变性是确保某些东西不会改变的过程。例如,想象一个 C-program 的静态二进制文件。一旦将其发布到万维网或最终用户,您不希望其内容发生变化,因此您希望它是 immutable.
这与哈希相关。一旦你 "hash" 一个对象,你不希望它的内容改变,否则你会得到一个不同的散列。如果你改变了内容而哈希没有改变,那么你就有了冲突!
元组只是一种数据结构,应该既是 immutable 又是可散列的。如果您这样做时遇到问题,可能是代码问题。
Immutable表示对象,即item的top-level容器,不能改变。请注意,这仅适用于 到顶层;它可能包含对可变的 sub-objects 的引用。
Hashable有一个函数定义:Python的built-in
hash
函数returns一个价值。这通常意味着对象的闭包(在所有对其 leaf-node 值的引用之后)由不可变对象组成。您的前提不正确:元组 可以 包含可变项。任何此类引用都会呈现元组 un-hashable.
例如:
>>> 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']
.