在Python中,遍历kwargs时顺序由什么决定?
在Python中,我写了这个函数来学习**kwargs
是怎么工作的:
def fxn(a1, **kwargs):
print a1
for k in kwargs:
print k, " : ", kwargs[k]
然后我用下面的方式调用了这个函数:
fxn(3, a2=2, a3=3, a4=4)
这是我的Python解释器打印出来的结果:
3
a3 : 3
a2 : 2
a4 : 4
为什么这个循环先打印了a3的值,而不是a2的值,尽管我先把a2传给了我的函数呢?
6 个回答
11
在Python的3.6版本中,终于引入了一个新特性:dict
(字典)现在是有顺序的,这意味着你传入的关键字参数的顺序会被保留下来。
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'])
11
这就是一个字典。正如文档中提到的,字典是没有顺序的(来源于 http://docs.python.org/tutorial/datastructures.html#dictionaries):
最好的理解方式是把字典看作是一个无序的键值对集合,而且这些键在一个字典中必须是唯一的。
不过,你可以让它以某种顺序处理,方法有:
使用
sorted()
函数:def fxn(a1, **kwargs): print a1 for k in sorted(kwargs): # notice "kwargs" replaced by "sorted(kwargs)" print k, " : ", kwargs[k]
或者使用
OrderedDict
类型(你可以传入一个包含所有键值对的OrderedDict
对象作为参数):from 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))))
24
kwargs
是一个字典。字典是无序的——简单来说,就是里面的东西没有固定的顺序,这个顺序也不是我们需要关心的细节。如果你深入了解字典的内部工作原理,会发现它的顺序会因为里面每个项的哈希值、插入的顺序等等而变化得很大,所以最好不要依赖于它的顺序。