注意:Python 3.6 引入了一个新的 order-preserving implementation 或 dict,这使得从 3.6 开始以下内容已过时。
以下是您的示例在三个不同的 Python 3.4 解释器会话中的三个迭代:
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'z': 'z', 'a': 'a', 5: 5}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 'a': 'a', 5: 5, 'z': 'z'}
Python 3.4.1 (default, Aug 8 2014, 15:05:42)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> d={}
>>> d[5]=5
>>> d[1]=1
>>> d["z"]="z"
>>> d["a"]="a"
>>> s=str(d)
>>> print(s)
{1: 1, 5: 5, 'z': 'z', 'a': 'a'}
所以,不,字符串表示没有排序,甚至在解释器的调用中也没有排序。在 Python 3.2 及之前的版本中,字典的顺序(及其字符串表示形式)是任意的但一致 - 但是,由于security fix,这在 Python 3.3 中发生了变化:
默认情况下,str、bytes 和 datetime 对象的__hash__() 值是用不可预知的随机值“加盐”的。尽管它们在单个 Python 进程中保持不变,但它们在 Python 的重复调用之间是不可预测的。
这是为了防止由精心选择的输入引起的拒绝服务,这些输入利用字典插入的最坏情况性能,O(n^2) 复杂度。详情请见http://www.ocert.org/advisories/ocert-2011-003.html。
更改哈希值会影响 dicts、sets 和其他映射的迭代顺序。 Python 从未对这种顺序做出保证(它通常在 32 位和 64 位版本之间变化)。