Python2中的字典是无序的,其顺序取决于键的哈希值,正如Martijn Pieters在这个很好的答案中所解释的那样。我认为你不能在这里使用字典,但你可以使用一个OrderedDict
(需要Python 2.7或更高版本),它维护键的顺序。例如:
from collections import OrderedDict
data = [('b', 0), ('a', 0)]
d = dict(data)
od = OrderedDict(data)
print(d)
print(od)
您可以像pickle字典一样pickle一个OrderedDict,但是顺序将被保留,并且在pickle相同对象时生成的字符串将是相同的。
from collections import OrderedDict
import pickle
data = [('a', 1), ('b', 2)]
od = OrderedDict(data)
s = pickle.dumps(od)
print(s)
请注意,不应在
OrderedDict
的构造函数中传递字典,因为键已经被放置。如果您有一个字典,您应该先将其转换为具有所需顺序的元组。OrderedDict是dict的子类,并具有所有dict方法,因此您可以创建一个空对象并分配新键。
您的测试未失败,因为您正在使用相同的Python版本和相同的条件-字典的顺序不会在循环迭代之间随机更改。但是,我们可以演示当我们改变字典中键的顺序时,您的代码如何无法产生不同的字符串。
import pickle
initial = pickle.dumps({'a': 1, 'b': 2})
assert pickle.dumps({'b': 2, 'a': 1}) != initial
当我们将键“b”放在首位时,生成的字符串应该与将键“a”放在首位时不同(在Python >= 3.6中会有所不同),但在Python2中它们是相同的,因为键“a”在键“b”之前。
回答你的主要问题,Python2字典是无序的,但使用相同的代码和Python版本时,字典可能具有相同的顺序。但是,该顺序可能与您在字典中放置项目的顺序不同。如果顺序很重要,最好使用OrderedDict或更新Python版本。
xrange
,这意味着Python 2中字典键的顺序是随意的(这使得字符串表示法无用)。 - DeepSpacecollections.OrderedDict
呢? - jpppickle = dumps
。如果您所做的只是传递相同数量的参数,则不需要使用lambda。 - GP89