您的位置:首页 > 编程语言 > Python开发

Python 里 immutable和hashable的概念

2015-09-07 23:11 351 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/pilicurg/article/details/48276093

Python 里有两个紧密联系的概念: immutable和hashable. 都是描述一个对象的属性。

immutable

immutable指对象一经创建,即不可修改。对象是不是immutable取决于数据类型,比如整型(integer)、字符串(string)和元组(tuple)都是immutable,而列表(list)、字典(dictionary)、集合(set)都是mutable。这种不可修改体现在:
字符串不能原位(in-place)修改,而list可以:

>>> string = 'Hello'
>>> string[3:] = 'a'

Traceback (most recent call last):
File "", line 1, in
string[3:]='a'
TypeError: 'str' object does not support item assignment
>>>
>>> lst=[1,2,3,4]
>>> lst[2:] = [1]
>>> lst
[1, 2, 1]

tuple没有方法,而list有很多

>>> tpl = (1, 2, 3)
>>> tpl.remove(1)

Traceback (most recent call last):
File "", line 1, in
tpl.remove(1)
AttributeError: 'tuple' object has no attribute 'remove'
>>>
>>> tpl.append(1)

Traceback (most recent call last):
File "", line 1, in
tpl.append(1)
AttributeError: 'tuple' object has no attribute 'append'
>>>
>>> lst = [1, 2, 3]
>>> lst.remove(3)
>>> lst
[1, 2]
>>> lst.append(3)
>>> lst
[1, 2, 3]

于是,immutable的对象可以作为一个固定不变的对象,适合作为哈希表的索引,因而它们是hashable的。

hashable

哈希表是在一个关键字和一个较大的数据之间建立映射的表,能使对一个数据序列的访问过程更加迅速有效。用作查询的关键字必须唯一且固定不变,于是只有immutable的对象才可以作为关键字,也叫hashable.
如上所述,整型(integer)、字符串(string)和元组(tuple)都可以作为关键字,而list不可以。

>>> dct = {1:2, 'Ben':123, (1,2,3):456}
>>> dct = {1:2, 'Ben':123, [1,2,3]:456}

Traceback (most recent call last):
File "", line 1, in
dct = {1:2, 'Ben':123, [1,2,3]:456}
TypeError: unhashable type: 'list'

immutable与unchangable

tuple是immutable的,即使它包含一个mutable的元素后,仍然可以认为tuple是immutable的,因为他作为一个容器,里面包含对象并没有变化。

>>> t = ([1, 2, 3], 4, 5)
>>> t[0][0] = 0
>>> t
([0, 2, 3], 4, 5)
>>> t[0] = 0

Traceback (most recent call last):
File "", line 1, in
t[0] = 0
TypeError: 'tuple' object does not support item assignment

原文链接:http://www.lfhacks.com/tech/immutable-hashable-in-python

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: