【发布时间】:2015-11-16 20:22:01
【问题描述】:
运行此代码时,结果会按预期变化,因为集合是无序的:
my_set_1 = {'a','b','c',}
print([i for i in my_set_1])
也就是说,多次运行会给出不同的列表,例如
['a', 'c', 'b']
['b', 'a', 'c']
['a', 'c', 'b']
['c', 'b', 'a']
等等
(注意:如果您没有 PYTHONHASHSEED=random,则可能会得到相同的结果,如 cmets 中所建议的那样。此外,如果您使用控制台来复制它,确保每次运行代码时重新运行控制台。)
然而,当将上面的代码放在 for 循环中时,结果相当令人惊讶:
for i in range(10):
my_set_1 = {'a','b','c',}
print([i for i in my_set_1])
# Prints:
# ['a', 'c', 'b']
# ['a', 'c', 'b']
# ['a', 'c', 'b']
# ....
for 循环的单次运行将打印相同的列表。重新运行 for 循环可以打印不同的列表(例如 ['c', 'b', 'a']),但仍会打印 10 次而不会更改。
为什么不改变?
【问题讨论】:
-
我的测试似乎表明 set 确实在运行之间保持顺序(相同的项目,未修改),它只是不能保证特定的顺序。无法重现您的第一个集合语句,从而在列表理解运行中产生不同的排序。
-
@ReutSharabani 您是否在控制台中运行该代码?如果是这样,请在模块中尝试此代码并运行该模块。
-
set中的顺序是任意的。
-
你能提供一个的代码来说明问题吗?
-
他们没有
PYTHONHASHSEED=random,这就是他们无法复制的原因。可能您可以在答案中注明。
标签: python python-3.x for-loop set unordered