Python的字典(dict)是很常用的,但字典的key的选用是需要注意的,并不是所有数据类型都可以作为字典的key;当True、False和数字作为dict的key时会发生「诡异」的事。

什么数据类型可以作为Python字典的key?

只有可散列的数据类型才能用作字典的key。可散列的数据类型包括:

  • 原子不可变数据类型: str、bytes、True、False和数值类型
  • frozenset(不可变集合)
  • 包含的所有元素都是可散列类型的元组(tuple)

第三种尤其要注意,不是所有的元组都可以作为字典的key。

当True、False和数字作为dict的key时:

示例1:

>>> {True: 'True', 1: '1', 1.0: '1.0', 1.00: '1.00'}
>>> {False: 'False', 0: '0', 0.0: '0.0', 0.00: '0.00'}

想想上面的输出结果是什么?

答案是:

{True: '1.00'}
{False: '0.00'}

示例2:

>>> {2.10: '2.10', 2.100: '2.100', 2.1: '2.1', 2.1000: '2.1000'}
>>> {1.0: '1.0', 1: '1', 1.00: '1.00', 1.000: '1.000'}

想想上面的输出结果是什么?

答案是:

{2.1: '2.1000'}
{1.0: '1.000'}  

注意上面这个答案的key,为什么是2.1和1.0而不是其它的key?代码在Python2.7和Python3.6结果相同。

综上,当True、False和数字作为dict的key时,可能会产生非预期的结果,这点需要警惕,当然一般很少会同时把bool和数字当做key,但最好是避免用bool或数值类型当作key。