字典的字符串表示在 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 中是不是有顺序?的主要内容,如果未能解决你的问题,请参考以下文章