众所周知,在Python中,集合(set)与数学中集合的概念类似,用于保存不重复的元素。它有可变集合和不可变集合(frozenset)两种。其中,可变集合是无序的,每次输出的元素排列顺序有可能不同。
然而,在某日Python练习中,偶然发现某整数集合在使用print函数输出时是有序的:
set1 = {'水瓶座', '双子座', '巨蟹座', '金牛座'}
set2 = {3, 1, 4, 1, 5, 9, 2, 6}
set3 = {'python', 28, ('人生苦短', '及时行乐')}
print(set1)
print(set2)
print(set3)
其输出结果如下:
{'水瓶座', '金牛座', '双子座', '巨蟹座'}
{1, 2, 3, 4, 5, 6, 9}
{('人生苦短', '及时行乐'), 'python', 28}
反复尝试几十次,发现整数集合set2的每次输出都是有序的,而其他片段顺序不同:
{'水瓶座', '金牛座', '巨蟹座', '双子座'}
{1, 2, 3, 4, 5, 6, 9}
{28, ('人生苦短', '及时行乐'), 'python'}
经查阅,在本站博主【Ice-冰鸽】处找到答案:
链接: link
这是因为python3版本在输出值较小的集合时会自动从小到大输出,而遇到大值的时候就不会了。
经测试确实如此:
set4 = {45254, 35, 621, 7, 2, 8, 4, 4523, 2346, 99}
set5 = {'python', 'java', 'C#', 'C', 28, 7, 3, 72, 135, 7, 35, ('人生苦短', '及时行乐')}
print(set4)
print(set5)
输出结果为:
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{'C', 3, 35, 'python', 7, 72, 'C#', 135, 'java', 28, ('人生苦短', '及时行乐')}
但此时又产生了新的问题:同样输出几十次后,全为整数的集合set4确实不再有序了,但每次的顺序依旧是一样的,还是{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}。此外,如果使用以下代码:
set4 = {45254, 35, 621, 7, 2, 8, 4, 4523, 2346, 99}
set5 = {'python', 'java', 'C#', 'C', 28, 7, 3, 72, 135, 7, 35, ('人生苦短', '及时行乐')}
for i in range(10):
print(set4)
print(set5)
那么输出结果中set5也将固定顺序:
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
挖个坑,以后再填。