这是在issue 27495中提出的,它是一个错误,而不仅仅是一个设计选择,但显然尚未解决。
这是问题中的另一个示例,它可能更清楚地说明了您在 Python 3 中识别的行为:
>>> import string, pprint
>>> pprint.pprint(set(string.digits))
{'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
这同样适用frozenset()
,但请注意,多行pprint
输出在 Python 3中排序,例如:
>>> pprint.pprint(set(string.digits), width=1)
{'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9'}
但是,在 Python 2 中,对相同原始代码的输出进行了排序:
>>> pprint.pprint(set(string.digits))
set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
我认为是 Python 3 和 Python 2 之间以及单行多行行为之间的不一致导致了这个错误。
对于dict
s,一个类似的示例,如您所见,说明了输出在 Python 3 或 2 中排序,因为它应该是:
>>> pprint.pprint({i:None for i in set(string.digits)})
{'0': None,
'1': None,
'2': None,
'3': None,
'4': None,
'5': None,
'6': None,
'7': None,
'8': None,
'9': None}
pprint
但是,对于 Python 3.6, sort s可能被认为是令人惊讶的,dict
因为它们是order now。但是,由于这只是一个实现细节(目前),我想没有义务pprint
维护插入顺序(还),这样做会破坏pprint
Python 版本中始终排序的自身的一致性dict
。