我们知道常规Python词典是无序的,但是当键是自然数字集的情况呢?当域是自然数的集合时,hash
函数似乎是一个身份函数,并且迭代x = {0:'a', 1:'b', 2:'c'}
之类的东西似乎产生了密钥的自然顺序,即0,1,2。
这种行为可以依赖吗?
(是的,我知道OrderedDict)
编辑:
这是我的具体用法,或者至少这可以捕捉到我所看到的精神。
x = dict((a, chr(a)) for a in range(10))
for i in x:
print i
这似乎保留了秩序。
答案 0 :(得分:6)
不。永远不要依赖字典键的顺序。一个说明性的例子:
>>> {0: 1, 8: 2}
{0: 1, 8: 2}
>>> {8: 1, 0: 2}
{8: 1, 0: 2}
这是因为字典以8个桶开始。因此,0和8最终在同一个桶中,这将导致立即冲突。顺序取决于首先插入的顺序。 (但不要依赖于那个:初始大小不是保证!)
但是,你是正确的hash
int
(在Python 2.x中)是身份函数(唯一的例外是-1
,它被映射到-2
以避免与通常的“错误返回”值发生冲突)。但是,int
和long
之间的区别有时非常微妙,long
使用不同的哈希算法(因为它们可以任意大)。
答案 1 :(得分:0)
不,你不能依赖这种行为。这是一个实现细节,可以从一个版本的Python更改为下一个版本,甚至从一个系统更改为下一个系统。
话虽如此,但不太可能很快改变。
答案 2 :(得分:0)
没有。订单还取决于密钥的插入顺序。