我有一个简单的python脚本,它将对象pickle并打印出来。在
import pickle
o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}
d = pickle.dumps(o)
print(d)
以下是我多次执行同一脚本时得到的输出:
b'\x80\x03}q\x00(X\x05\x00\x00\x00firstq\x01K\x01X\x05\x00\x00\x00thirdq\x02K\x03X\x06\x00\x00\x00secondq\x03K\x02X\x02\x00\x00\x00lsq\x04]q\x05(K\x01K\x02K\x03eu.'
b'\x80\x03}q\x00(X\x05\x00\x00\x00thirdq\x01K\x03X\x02\x00\x00\x00lsq\x02]q\x03(K\x01K\x02K\x03eX\x05\x00\x00\x00firstq\x04K\x01X\x06\x00\x00\x00secondq\x05K\x02u.'
b'\x80\x03}q\x00(X\x05\x00\x00\x00firstq\x01K\x01X\x06\x00\x00\x00secondq\x02K\x02X\x02\x00\x00\x00lsq\x03]q\x04(K\x01K\x02K\x03eX\x05\x00\x00\x00thirdq\x05K\x03u.'
{/cd4}
这仅仅是对象属性排序的不同,还是有更多的区别?在
在Python3中,字典顺序依赖于散列随机化。每次启动解释器时,都会使用不同的随机散列种子。如果你要打印字典,你也会看到不同的顺序:
Python使用随机种子来防止针对将传入用户数据解析到字典(如web服务器)的程序的某些类型的拒绝服务攻击;这种攻击可以预测两个字符串何时会在字典中引起哈希冲突,并向Python提供只会造成冲突的值,将Python程序减速到爬行状态。在
可以使用^{} environment variable 将种子设置为固定值,也可以完全禁用哈希随机化:
^{pr2}$另请参见:Why is the order in dictionaries and sets arbitrary?
相关问题 更多 >
编程相关推荐