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

时间:2014-09-14 05:29:40

标签: python python-3.x dictionary python-3.4

我知道Python中的字典本身没有顺序。但是,如果你在字典上调用str(),如果它总是以相同的顺序,我很好奇。它似乎是按键分类的,无论我添加项目的顺序如何:

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

我知道很多人都会想说它没有排序,但请试着通过获得未分类的结果来证明我的错误。

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

2 个答案:

答案 0 :(得分:3)

不,他们不是。

import string

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

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

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

答案 1 :(得分:3)

  

注意: 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之间无法预测它们。

     

这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html

     

更改散列值会影响dicts,集和其他映射的迭代顺序。 Python从未对这种排序做出保证(通常在32位和64位版本之间有所不同)。