list(set())顺序发生改变

今天同事问我一个问题,为啥他对一个列表用set去重后在转为list,原来的列表顺序就会发生改变。想来应该是set本身无序,经过他处理顺序就会发生改变,但是这样说感觉没有说服力,就自己试了一下。
list(set())顺序发生改变_第1张图片
为啥列表[1,8]和列表[8,1]结果一样
list(set())顺序发生改变_第2张图片
为啥有时候给咱排序,有时候不给咱排序。完全搞不懂他是想弄啥嘞。默默的去看了一下set的原理,才发现了问题。
set去重是通过__hash__和__eq__结合来完成。后者不用说了就是判断相等,前者构造了一个哈希表,啥事哈希表,这里就不细讲了。这里面的哈希表可以把它当做一个字典(中华字典,并不是dict),每次运行__hash__都会生成一个哈希表,这个东西咱没给他指定表,人家怎么生成的就不知道了(可能是随机的也可能有一定的规律,这块咱不懂也不敢乱说)。弄到这就知道为啥他会乱序,这个坑咱就算记住了。
踩了这个坑怎么办?以后绕着他走还是给他补上,当然绕是不可能绕的,只要有方法就不可能绕。
sort()排序,用列表进行sort排序,排序规则按照set钱的列表索引
举个例子哈
list(set())顺序发生改变_第3张图片
这个例子大家都能看懂把。
好吧这个坑到这算是知道问题在哪,怎么解决。如果哪位仁兄能够详细告知内部原理,小弟也是万分感谢

你可能感兴趣的:(bug整理)