- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
python中字典的键是唯⼀的吗_Python中字典的key都可以是什
么
作者:Inotime
来源:CSDN
答:⼀个对象能不能作为字典的key,就取决于其有没有__hash__⽅法。所以所有python⾃带类型中,除了list、dict、set和内部⾄少带有
上述三种类型之⼀的tuple之外,其余的对象都能当key。
⽐如数值/字符串/完全不可变的元祖/函数(内建或⾃定义)/类(内建或⾃定义)/⽅法/包等等你能拿出⼿的,不过有的实际意义不⾼。还有数
值型要注意,因为两个不同的相等数字可以有相同的哈希值,⽐如1和1.0。
解释:
代码版本:3.6.3;⽂档版本:3.6.6
Unlike sequences, which are indexed by a range of numbers, dictionaries are indexed by keys, which can be any immutable
type; strings and numbers can always be keys. Tuples can be used as keys if they contain only strings, numbers, or tuples;
if a tuple contains any mutable object either directly or indirectly, it cannot be used as a key. You can’t use lists as keys,
since lists can be modified in place using index assignments, slice assignments, or methods like append()and extend().
字典的键可以是任意不可变类型,需要注意的是tuple元组作为键时,其中不能以任何⽅式包含可变对象。
那。。到底什么样的是不可变类型呢?不可能给对象专门标注⼀个属性是可变类型还是不可变类型啊,这没有任何其他意义,⼀定是通过其
他途径实现的。把list当做键试⼀下
a = [1, 2, 3]
d = {a: a}
# 第⼆⾏报错 :
# TypeError: unhashable type: 'list'
报错说list类型是不可哈希的,噢,原来是靠能不能hash来判断的,另外⽂档下⾯接着说同⼀字典中每个键都是唯⼀的,正好每个对象的哈
希值也是唯⼀的,对应的很好。
It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique
(within one dictionary).
查看源代码可以看到object对象是定义了__hash__⽅法的,
⽽list、set和dict都把__hash__赋值为None了
# 部分源码
class object:
""" The most base type """
def __hash__(self, *args, **kwargs): # real signature unknown
""" Return hash(self). """
pass
class list(object):
__hash__ = None
class set(object):
__hash__ = None
class dict(object):
__hash__ = None
那这样的话。。。我给他加⼀个hash不就能当字典的key了,key不就是可变的了。注意:此处只是我跟着想法随便试,真的应⽤场景不要
⽤可变类型作为字典的key。
class MyList(list):
"""⽐普通的list多⼀个__hash__⽅法"""
def __hash__(self):
# 不能返回hash(self)
# hash(self)会调⽤self的本⽅法,再调⽤回去,那就没完了(RecursionError)
# ⽤的时候要注意实例中⾄少有⼀个元素,不然0怎么取(IndexError)
return hash(self[0])
l1 = MyList([1, 2]) # print(l1) -> [1, 2]
d = {l1: 'Can?'}
print(d) # --> {[1, 2]: 'Can
您可能关注的文档
- 水污染控制工程课程设计26P.pdf
- 场外出调研根据以往经验波动时大概会出现相关问题我先打个预防针.pdf
- “青春芒果节”背后,芒果TV用创意传播青春.pdf
- 一年级上册期末语文试卷.pdf
- 一年级语文上册第七单元点整理.pdf
- 【慕课】互金单元测试及答案第三章虚拟货币与数字货币1499.pdf
- 《高等数学》(工科类专业适用)课程教学大纲.pdf
- 2022年执业药师《药学专业知识》考试试题及答案解析(精华篇).pdf
- 2021年高中春天的作文600字三篇.pdf
- PS封装格式:GB28181协议RTP传输.pdf
- 2023年06月福建宁德市福安市华荣劳务派遣有限公司公开招聘1人上岸笔试必备资料历年试卷名师甄选附答案详解.docx
- 2023年04月温州市少年宫招考兼职(外聘)教师笔试历年难易错点考题含答案带详细解析_1.docx
- 2023年“惠聚优才”—广东省惠州市惠阳区招考聘用高素质教师100人笔试历年难易错点考题含答案带详细解析_1.docx
- 2023年06月浙江宁波大学科学技术学院非事业编制人员招考聘用笔试历年难易错点考题含答案带详细解析_1.docx
- 2023年03月四川自贡市市属事业单位第一批考核聘用人员32人笔试历年难易错点考题含答案带详细解析.docx
- 2023年02月苏州市相城区事业单位公开招聘99名工作人员笔试历年难易错点考题含答案带详细解析.docx
- 2023年山东菏泽巨野县人民医院引进急需紧缺专业人才26人笔试历年难易错点考题含答案带详细解析.docx
- 2023年03月广东佛山市南海区建筑工程质量监督站公开招聘公益一类事业编制人员9人笔试历年难易错点考题含答案带详细解析.docx
- 2023年云南丽江市第一高级中学选调中青年骨干教师7人上岸笔试必备资料历年试卷名师甄选附答案详解.docx
- 2023年重庆市合川区教育事业单位招考聘用63人上岸笔试必备资料历年试卷名师甄选附答案详解.docx
文档评论(0)