gpt4 book ai didi

python - 是什么决定了这个 python 3 代码中集合元素的顺序?

转载 作者:行者123 更新时间:2023-12-01 08:49:28 25 4
gpt4 key购买 nike

为什么元素的顺序只有在经过函数调用时才会改变?是什么决定了这个顺序?

# test_set_order.py
def unpack(input):
print('input is {}'.format(input))
result = []
for i in input:
result.extend(i)
return result

print(unpack({'A', 'B'}))

执行上面的脚本会产生不同的输出:

$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']
$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']

这是python 3.6.5 。关于Python 2.7.13总是得到相同的订单

似乎顺序只有在函数调用后才会改变。以前没有发生过:

>>> bla = {'A','B'}; print(bla)
{'A', 'B'}
>>> bla = {'A','B'}; print(bla)
{'A', 'B'}
>>> bla = {'A','B'}; print(bla)
{'A', 'B'}
>>> bla = {'A','B'}; print(bla)
{'A', 'B'}
>>> bla = {'A','B'}; print([i for i in bla])
['A', 'B']
>>> bla = {'A','B'}; print([i for i in bla])
['A', 'B']
>>> bla = {'A','B'}; print([i for i in bla])
['A', 'B']
>>> bla = {'A','B'}; print([i for i in bla])
['A', 'B']
>>> bla = {'A','B'}; print([i for i in bla])
['A', 'B']

更新:

似乎与散列有关,并且是在解释器启动时决定的。这足以重现:

$ python -c "print({'A', 'B'})"
{'B', 'A'}
$ python -c "print({'A', 'B'})"
{'A', 'B'}

'A'.__hash__())的值每次改变 python 3

最佳答案

Python 中的集合是无序的。您不应该期望一致性。

举个简单的例子,在 Python3 的 REPL (python -i) 中,

>> x={3,1,2}
>>> print(x)
{1, 2, 3}

Python2 也类似

>>> x={3,2,1}
>>> print(x)
set([1, 2, 3])

它们也不是简单地自动排序,如这个 Python3 示例所示:

>>> x={3,('a','b'), 'x',0.11,'y',None, 'z',4.11,('c','d')}
>>> print(x)
{0.11, 3, 'y', 4.11, ('c', 'd'), 'x', ('a', 'b'), None, 'z'}

如果您希望它们保持插入的顺序,请使用 OrderedSetthis或者只是重复使用 OrderedDict

关于python - 是什么决定了这个 python 3 代码中集合元素的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53187866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com