什么决定了这个 python 3 代码中集合元素的顺序? [复制]

Posted

技术标签:

【中文标题】什么决定了这个 python 3 代码中集合元素的顺序? [复制]【英文标题】:what is deciding the order of the set elements in this python 3 code? [duplicate] 【发布时间】:2018-11-07 10:43:12 【问题描述】:

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

# 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 上都会改变

【问题讨论】:

散列决定了顺序,但是这些都是无证的,不能保证实现细节,如果你想要一个特定的顺序,不要使用集合 @Chris_Rands 这与您链接的问题不同。为什么顺序只在函数调用期间发生变化?而不是在其他示例中 看我的第二个骗子***.com/questions/49896202/…,原因是Python 3默认启用哈希随机化,你可以通过PYTHONHASHSEED关闭它 酷,谢谢!那个更好:) 【参考方案1】:

集合在 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'

如果您希望它们保持插入的顺序,请使用 OrderedSet(如 this)或重复使用 OrderedDict

【讨论】:

OrderedSet 不是标准库中的东西 已添加说明【参考方案2】:

因为by definition 一个集合是一个无序对。如果您想订购它们,请使用list。

只需替换:

'A', 'B'

与:

['A', 'B']

这是因为集合是使用花括号 创建的,而列表是使用括号 [] 定义的

【讨论】:

以上是关于什么决定了这个 python 3 代码中集合元素的顺序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python中集合的用法

python中集合和字典的区别

python中集合

python中集合的特点和注意点?

python中集合-set

python中集合的运算(转)