关键字参数的插入顺序现在是3.6版Python中的guaranteed to be preserved。通过更改dict
对象的基础表示,可以实现这一点。
但是,已经声明 - somewhat strenuously - 一般来说,dict
对象的订单保存一般不应该依赖。文档用这种方式解释了这种情况:
考虑了这个新实现的顺序保留方面 一个实施细节,不应该依赖(这可能 未来的变化,但希望有这个新的词典 在更改之前,在几种版本的语言中实现 语言规范要求所有当前的命令保留语义 和未来的Python实现;这也有助于保存 向后兼容旧版本的语言 随机迭代顺序仍然有效,例如, Python 3.5)。
PEP 468没有提及复制关键字参数的任何内容。但有时人们可能希望迭代kwargs
个参数的副本(例如,在for循环中变异kwargs
时):
def i_will_never_fail(**kwargs):
for thing1,thing2 in zip(kwargs.copy(), kwargs):
assert thing1==thing2
我的问题是:kwargs.copy()
产生的对象的顺序是否也应该被保证?或者这也应该被视为实施细节?是OrderedDict
only mostly dead吗?
答案 0 :(得分:1)
答案取决于实施。
假设非常受欢迎的CPython,答案是肯定的。正如您在dictobject.c
代码中的PyDict_Copy
函数(第2615行)中所看到的,随着值的增加引用,该函数开始使用该片进行复制
split_copy->ma_keys = mp->ma_keys;
这一点,在为mp
分配了一个dicitionary对象之后(或者更确切地说,是将原始dict
明确地转换为PyDictObject
)。
由于密钥保留了它们的顺序,并且考虑到当前的存储形式(如Jim's explanation here中所示),因此生成的字典应该以相同的方式排序。
同样,这当前被认为是实施细节,您应该不使您的任何代码依赖它。