第三行代码的意思就是,key这这个变量作为d这个字典的一个键,而“a list”是这个键所对应的值。
类似于key是你写的代码中的 ‘Michael’,而‘a list’是 95。
我举这个例子的意思就是当我们把可变量比如列表,作为字典的键时,就会导致值所对应的键不确定。
------------------------------------------------------------分割线-----------------------------------------------------------
你想,dict的原理是数学中的映射,而python为了使dict得查询速度更快,算法复杂度更低,所以使用的就是哈希方法来实现。
而哈希方法是通过键产生一个hash value来进行查找对应的值。所以如果是两个键,那么就会产生两个不同的hash value,那么这两个键所对应的值对象必定是不同的。
反看我们的代码,当我们使用list作为键时,因为list是一个可变量,所以就会因为调用自身方法而改变自身,所以就会改变产生的hash value,就找不到存储的值了。
-----------------------------------------------------分割线-------------------------------------------------------------------
大致说了dict的机制,最后说一下可变量与不可变量。
我们将int、str类型分为不可变对象,而list是可变对象。
说int、str是不可变的,是因为它们调用自身方法,例如字符串调用replace方法,不会改变变量本来的值,而list调用自身方法则会改变。举个例子:
- >>> a = 'abc'
- >>> a.replace('a', 'A')
- 'Abc'
- >>> a
- 'abc'
复制代码
变量a没有发生改变。
- >>> a = ['c', 'b', 'a']
- >>> a.sort()
- >>> a
- ['a', 'b', 'c']
复制代码
这个时候变量a作为一个列表,其内部在调用方法后就发生了改变。
而综合前面说的hash方法,如果将list作为键来存储值,而list本身可能会因为调用自身方法而改变,进而导致hash value发生改变,使我们在输入键去找值时,就找不到对应的值了。
所以不能使用list这一类可变对象作为dict的键。而要使用int、str这一类不可变对象作为dict的键。
PS:讲的比较啰嗦,也很粗浅,如果有不对的地方,还请谅解。