浅谈Python的字典键名可以是哪些类型

 更新时间:2021年09月02日 10:41:20   作者:张欣-男  
本文主要介绍了Python的字典键名可以是哪些类型,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

今天看别人代码时发现一个事,就是把对象当作字典的键名,并且把两个对象(类的实例)当作键名,然后去查了下:

键必须是不可变的,如字符串,数字或元组。

1 键的类型,列表/字典不可以,其它都可以

但是网上却没有说其他类型可不可以,怎么用的。我写代码试了下:

class Person:
    def __init__(self, name):
        self.name = name

i = 5
s = 'abc'
t = (5,'a')
p = Person('Lily')
q = Person('xiao')
m = {'a':1, 'b':10}
lst = [1,2,3]

d = {}
d[i] = 'five'
d[s] = 'ABC'
d[t] = 'five-a'
d[p] = 'name:Lily'
# d[lst] = 'list : 1,2,3'
# TypeError: unhashable type: 'list'
d[p, q] = 'two people: Lily and xiao'
d[i,s,t,p,q] = 'all in key'

for k, v in d.items():
    print(k, '=>', v)

输出结果:

5 => five
abc => ABC
(5, 'a') => five-a
<__main__.Person object at 0x000001803EEF27F0> => name:Lily
(<__main__.Person object at 0x000001803EEF27F0>, <__main__.Person object at 0x000001803EEF28D0>) => two people: Lily and xiao
(5, 'abc', (5, 'a'), <__main__.Person object at 0x000001803EEF27F0>, <__main__.Person object at 0x000001803EEF28D0>) => all in key

2 多个对象可当作键名,顺序不同时是不同的键

print(d[p, q])
print(d[q, p])

输出:

two people: Lily and xiao
Traceback (most recent call last):

  File "<ipython-input-15-12aff481ab93>", line 1, in <module>
    runfile('C:/Users/Xpeng/.spyder-py3/temp.py', wdir='C:/Users/Xpeng/.spyder-py3')

  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Xpeng/.spyder-py3/temp.py", line 37, in <module>
    print(d[q, p])

KeyError: (<__main__.Person object at 0x000001803EF58940>, <__main__.Person object at 0x000001803EF58668>)

3 结论【有误】:

(1)除了列表不能当作键名,其它都 可以,还可以放多个。
(2)我是这样理解的,列表是可变的,其他类型都是不可变的。对象作为键名时,实际传入的是对象的地址,也是不可变的。
(3)放多个时不同顺序时键不同。

------2020.04.07更新-----
感谢两次网友的提醒。
(1)准确的说是列表、字典这种不可哈希(unhashable)的类型不可当做键值,可哈希的类型才可当作键。

到此这篇关于浅谈Python的字典键名可以是哪些类型的文章就介绍到这了,更多相关Python 字典键名 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 对给定可迭代集合统计出现频率,并排序的方法

    python 对给定可迭代集合统计出现频率,并排序的方法

    今天小编就为大家分享一篇python 对给定可迭代集合统计出现频率,并排序的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • django 数据库连接模块解析及简单长连接改造方法

    django 数据库连接模块解析及简单长连接改造方法

    今天小编就为大家分享一篇django 数据库连接模块解析及简单长连接改造方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 基于python中pygame模块的Linux下安装过程(详解)

    基于python中pygame模块的Linux下安装过程(详解)

    下面小编就为大家带来一篇基于python中pygame模块的Linux下安装过程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • python使用列表的最佳方案

    python使用列表的最佳方案

    这篇文章主要介绍了python使用列表的最佳方式,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • 学好python基本数据类型

    学好python基本数据类型

    这篇文章主要介绍了学好python基本数据类型,学习python基本数据类型我们需要了解基本数据类型有数字int、布尔值bool、字符串str、列表list、元组tuple、字典dict等,其中包括他们的基本用法和其常用的方法,下面来看看文章的具体介绍吧
    2021-12-12
  • 如何使用python提取字符串的中英文(正则判断)

    如何使用python提取字符串的中英文(正则判断)

    这篇文章主要给大家介绍了关于如何使用python提取字符串中英文的相关资料,主要通过正则re中的sub函数、findall函数以及compile函数判断来实现,需要的朋友可以参考下
    2021-05-05
  • python基于http下载视频或音频

    python基于http下载视频或音频

    这篇文章主要为大家详细介绍了python基于http下载视频或音频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • python 多线程实现检测服务器在线情况

    python 多线程实现检测服务器在线情况

    本文给大家分享的是Python使用多线程通过ping命令检测服务器的在线状况,给大家了内网和外网的2个例子,有需要的小伙伴可以参考下。
    2015-11-11
  • pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法

    pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法

    今天小编就为大家分享一篇pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python turtle库画圣诞树详细代码教程

    python turtle库画圣诞树详细代码教程

    这篇文章主要介绍了python turtle库画圣诞树详细代码教程,圣诞节快到了,下面小编就来利用python turtle库画一颗圣诞树, 主要成分有圣诞树的本体、大小蝴蝶结、星星、圣诞帽和袜子,需要的朋友可以参考一下
    2021-12-12

最新评论