字典的字符串表示在 Python 3.4 中是不是有顺序?

Posted

技术标签:

【中文标题】字典的字符串表示在 Python 3.4 中是不是有顺序?【英文标题】:Do string representations of dictionaries have order in Python 3.4?字典的字符串表示在 Python 3.4 中是否有顺序? 【发布时间】:2014-11-07 22:29:31 【问题描述】:

我知道 Python 中的字典本身没有顺序。但是,我很好奇当您在字典上调用 str() 时,它是否总是以相同的顺序排列。无论我添加项目的顺序如何,它似乎都已排序(按键):

d=
d[5]=5
d[1]=1
d["z"]="z"
d["a"]="a"
s=str(d)
print(s)

我知道很多人会说它没有排序,但请尝试通过得到未排序的结果来证明我错了。

那么,在 Python 3.4 中,字典是否默认转换为字符串排序?

【问题讨论】:

【参考方案1】:

注意: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 位版本之间变化)。

【讨论】:

【参考方案2】:

不,他们不是。

import string

d = 
for ch in string.ascii_lowercase:
    d[ch * 20] = ch
print(d)  # OR print(str(d))

输出(由于哈希随机化,每次运行都会改变):

'jjjjjjjjjjjjjjjjjjjj': 'j', 'ssssssssssssssssssss': 's', 'mmmmmmmmmmmmmmmmmmmm': ...

【讨论】:

有趣。但是,当我执行此处列出的代码时,pastebin.com/Rijtr3Mx 每次都会得到相同的结果,尽管它没有排序。你用同样的代码得到同样的结果吗? 别管这个问题,事实证明它保持不变,直到我关闭解释器并再次打开它。

以上是关于字典的字符串表示在 Python 3.4 中是不是有顺序?的主要内容,如果未能解决你的问题,请参考以下文章

python基础10 字符串操作,字典操作,集合操作

在python中合并字典值列表

Python字典

Python中字典的详细用法

Dictionary(字典)

18python基础学习-字典