python保留字,python的字典是无序的吗

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: