In Python, what determines the order while iterating through kwargs?
在python中,我编写了这个函数来教自己
1 2 3 4 | def fxn(a1, **kwargs): print a1 for k in kwargs: print k," :", kwargs[k] |
然后我调用了这个函数
1 | fxn(3, a2=2, a3=3, a4=4) |
这是我的Python解释器打印的输出:
1 2 3 4 | 3 a3 : 3 a2 : 2 a4 : 4 |
为什么for循环在a2的值之前打印a3的值,即使我先将a2输入到我的函数中?
这是一本字典。并且,如文档中所述,字典没有顺序(来自http://docs.python.org/tutorial/datastructures.html#dictionaries):
It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique (within one dictionary).
但你可以按照某种顺序进行处理,例如:
-
使用
sorted() :1
2
3
4def fxn(a1, **kwargs):
print a1
for k in sorted(kwargs): # notice"kwargs" replaced by"sorted(kwargs)"
print k," :", kwargs[k] -
或者使用
OrderedDict 类型(您可以将OrderedDict 对象作为包含所有键值对的参数传递):1
2
3
4
5
6
7
8from collections import OrderedDict
def fxn(a1, ordkwargs):
print a1
for k in ordkwargs:
print k," :", ordkwargs[k]
fxn(3, OrderedDict((('a2',2), ('a3',3), ('a4',4))))
这最终在3.6版本中引入:
1 2 3 4 5 6 | Python 3.6.0 (default, Jan 13 2017, 13:27:48) >>> def print_args(**kwargs): ... print(kwargs.keys()) ... >>> print_args(first=1, second=2, third=3) dict_keys(['first', 'second', 'third']) |
不幸的讽刺是,** kwargs的统一意味着以下方法不起作用(至少不是人们所期望的方式):
1 | od = OrderedDict(a=1, b=2, c=3) |
由于keyworded args首先构建在无序的dict中,因此您不能依赖它们按照列出的顺序插入到OrderedDict中。 :(
由于
实际上,作为许多编程语言中最近的安全问题的修复,将来订单甚至可能在程序的调用之间发生变化(Python解释器的调用)。