Re: [問題] set中key的順序是如何決定的?

作者: LiloHuang (十年一刻)   2019-03-17 17:41:48
猜測你大概新增了一些字串物件到一個 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
作者: shala (沙羅)   2019-03-17 18:20:00
太感謝啦,比我自己查到的還清楚明白
作者: jlhc (H)   2019-03-17 21:40:00
給推
作者: Angesi (小雲豹)   2019-03-19 10:16:00
舔!

Links booklink

Contact Us: admin [ a t ] ucptt.com