Python学习之路(24)——字典dict和集合set的key不变性

今天遇到一个朋友问到一个问题,元组tuple是不可变的,那么元组可以作为字典或者集合的key,那么为什么元组(1, [2, 3])不能作为字典的key呢?如下:

>>> set((1,2,3))
{1, 2, 3}
>>>
>>> d = {(1,2,3):'a',(1,2,4):'b'}
>>> d
{(1, 2, 4): 'b', (1, 2, 3): 'a'}
>>>
>>> set(((1,[2,3]),(1,[2,4])))
Traceback (most recent call last):
  File "<pyshell#330>", line 1, in <module>
    set(((1,[2,3]),(1,[2,4])))
TypeError: unhashable type: 'list'
>>>
>>> d2 = {(1,[2,3]):'A', (1,[2,4]):'B'}
Traceback (most recent call last):
  File "<pyshell#317>", line 1, in <module>
    d2 = {(1,[2,3]):'A', (1,[2,4]):'B'}
TypeError: unhashable type: 'list'

 

我们先讲讲字典。字典dict是Python唯一的标准mapping(映射)类型,mapping object把一个可哈希的值(hashable value)映射到一个任意的object上。

一个object是可哈希的(hashable),是指这个object在其生存期内有一个不变的哈希值(hash value),即__hash__()方法返回的值。

所有不可变的(immutable)内置object都是hashable的,比如string、tuple;所有可变的(mutable)内置容器都不是hashable的,比如list、dict(即没有__hash__()方法)。

字典dict的key必须是可哈希的,所以tuple,string可以做key,而list不能做key。

但是上面的例子,为什么会报错呢?

这里,元组作为字典的key,还有一个条件,就是元组内的值都是不可变的,而list作为元组的值,是可变的,因此不能作为字典的key。

而对于集合而言,就是没有键值的键的序列,其约束和字典一样。

posted on 2018-03-07 18:07  nicolas_Z  阅读(301)  评论(0)    收藏  举报

导航