作者LiloHuang (0x5f3759df)
看板Python
标题Re: [问题] set中key的顺序是如何决定的?
时间Sun Mar 17 17:41:48 2019
猜测你大概新增了一些字串物件到一个 Python set 如下
MacBook-Pro:~ lilohuang$ cat test.py
print(list(set(['a', 'b', 'c', 'd'])))
执行 test.py 多次的话会产生出不同的顺序的结果
MacBook-Pro:~ lilohuang$ python test.py
['d', 'a', 'b', 'c']
MacBook-Pro:~ lilohuang$ python test.py
['a', 'd', 'c', 'b']
MacBook-Pro:~ lilohuang$ python test.py
['a', 'c', 'd', 'b']
MacBook-Pro:~ lilohuang$ python test.py
['b', 'c', 'd', 'a']
原因在於 Python 预设使用随机的 hash seed 在 str, bytes 跟 datetime
https://docs.python.org/3/using/cmdline.html#envvar-PYTHONHASHSEED
多次执行 Python 得到的 seed 值就会不同,进而产生出了不同的 hash 值
在执行前加上了 PYTHONHASHSEED=0 应该就能得到相同的答案了吧?
MacBook-Pro:~ lilohuang$ PYTHONHASHSEED=0 python test.py
['a', 'b', 'c', 'd']
MacBook-Pro:~ lilohuang$ PYTHONHASHSEED=0 python test.py
['a', 'b', 'c', 'd']
MacBook-Pro:~ lilohuang$ PYTHONHASHSEED=0 python test.py
['a', 'b', 'c', 'd']
当物件的 hash 值是固定的时候,set 是如何找到空 slot 新增 entry 可参考
https://github.com/python/cpython/blob/master/Objects/setobject.c
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 35.234.29.115
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1552815714.A.161.html
※ 编辑: LiloHuang (35.234.29.115), 03/17/2019 17:47:48
1F:推 shala: 太感谢啦,比我自己查到的还清楚明白 03/17 18:20
2F:推 jlhc: 给推 03/17 21:40
3F:推 Angesi: 舔! 03/19 10:16