python保留字,python的字典是无序的吗
熟悉python的人都知道,python为我们提供了各种原生数据结构,比如list、tuple、set、dict等等。这些各种各样的数据结构为程提供了业务支持。但是要利用好这些对象,就必须了解这些结构的特点。
比如简单的区分:可变与不可变,有序与无序。
那么这篇文章想和大家分享一下这种紊乱的细节。
在我们开始之前,这个python郑重声明,集合和字典都是乱序的!和收藏字典都出问题了!和收藏字典都出问题了!不要看完这条蛇,然后得出一些奇怪的结论!本文基于python3.6,你是什么还是2.7?醒醒吧兄弟2018年了o(_)o哈哈
字典和收藏都乱了。只要稍微懂一点python的人,都很熟悉这句话。当你第一次接触python的时候,你学习了什么是iterable对象(大部分都想知道for循环可以遍历什么),什么是可变iterable对象,什么是不可变iterable对象,什么是无序,什么是有序。但你想过证明紊乱吗?自然,这条python也不例外。那你怎么证明紊乱呢?简单的暴力解决方案,只需写两行代码,定义一个集合然后打印出来就能看到结果了!
我的测试代码如下:
s={a , b , c}
印刷品
真的很简单,很暴力,很直接。看到这两行代码没有感叹人生苦短。我用的是python(这个Python大学的java)。好吧,我疯狂运行这个程序,输出结果自然不是唯一的。
紊乱!就是这个意思~
但事情没那么简单。我无意用int类型再试一次,如下:
s={1,2,3}
印刷品
猜猜发生了什么?在这种情况下,无论我多么疯狂地输出和运行这段代码,我得到的唯一结果是打印{1,2,3}
通过反复尝试,我发现只要是int类型,那么集合似乎就变得有序了。不管在声明这个集合时数字是如何排列的,输出结果总是按照固定的顺序!同样,我将dict字典的键值设置为int类型,此时字典就变成了固定的排序方式。
这是为什么呢?
此时,这条蛇需要继续声明set和dict出问题了!不要怀疑自己的专业知识。那么为什么会出现这种情况呢?答案只能从底层源代码中找到。
简单来说,字典和集合的无序在python中是如何实现的?
字典和集合乱序的实现是哈希表。没错,他们通过哈希值将对象放入哈希表,从而实现无序操作(众所周知,对象的哈希值是不断变化的)。
代码如下:
s={A , B , C}
打印(哈希( A ))
打印(哈希( B ))
打印(哈希( C ))
印刷品
把哈希值打印出来,结果就一目了然了~
如上图所示,每次哈希值不同,那么字符ABC在哈希表中的位置也不同。而集合是按照哈希表排列的,实现了集合的无序。
那么,我们对int类型进行同样的操作会怎么样呢?
s={1,2,3}
打印(哈希(1))
打印(哈希(2))
打印(哈希(3))
印刷品
在这一点上,一些猿可能知道结果。是的,结果如下:
不管我怎么努力输出,123的哈希值就是这么任性,就是123。没错,python中int类型的哈希值本身就是,所以set或dict中的排序方法是通过哈希表实现的,所以自然顺序不会改变。
于是,问题解决了~正是因为hash才造成了这种奇怪的现象。说到哈希表,不得不佩服python的精妙。dict是原生数据结构中常用的工具,用来存储大量复杂数据,类似于数据库。
在这种情况下,查询效率真的是关键。使用哈希表,以空间换时间的方式大大提高了查询效率,精彩~
所以!我不知道你在做随机列表的时候会不会这么做。反正这个python做到了(年少无知~),类似于下面这段代码:
L=[a , b , c]
L=列表(集合(L))
打印(左)
有吗?完美!精简!随机做。我甚至没有导入随机模块!如果转到一个没有重复对象的集合,那么转回来就是随机的~那么通过上面的分析,当int类型出现的时候,这种随机性就失去了意义~避免这样使用。而且在实际制作过程中,如果用列表随机解释,会有重复值~如果没有。为什么不用set。 ( 916
所以!记住那套坏了!不要利用int值是有序的!简单来说,我运行的时候用cPython做解释器,其他结果可能会不一样~而且python是胶水语言,万能的中央空调,可以匹配一切~所以不能保证你的代码一定只会用Cpython做解释器。
所以set和dict是无序的~但是在无序的世界里也有小惊喜等着我们去发现~
补充:Python中dict和set的比较
语法
词典
设置
定义
按键值存储的字典
仅保存列表值的集合。
自然
键与值一一对应。
存储值不能重复。
使用
存款:字典名[key]=值删除:字典名。pop (key) Replace:字典名[key]=新值
保存集合名称。添加(内容)删除:集合名称。remove(值)是交叉和互补的:
共同点:
set的原理和dict是一样的,所以不能用同样的方式放可变对象,因为不能判断两个可变对象是否相等,所以不能保证集合内部不会出现“重复元素”。
以上个人经验,希望能给大家一个参考,也希望大家多多支持剧本之家。如有错误或不足之处,请不吝赐教。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。