为什么只有在通过函数调用时才更改元素的顺序?是什么决定这个顺序?
$ 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
这是在2.7.13
上。在python >>> 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
的值每次在SyntaxError: Unexpected token . in JSON at position 1
上改变
答案 0 :(得分:1)
集合在Python中是无序的。您不应该期望一致性。
举一个简单的例子,在REPL for Python3(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'}
如果希望它们保持插入顺序,请使用this之类的OrderedSet
或仅重复使用OrderedDict
。
答案 1 :(得分:0)
因为by definition是一个无序对。如果要订购它们,请使用list。
只需替换:
{'A', 'B'}
具有:
['A', 'B']
这是因为使用大括号{}
创建了集合,并使用了括号[]
定义了列表