在Python中,遍历kwargs时顺序由什么决定?

13 投票
6 回答
6943 浏览
提问于 2025-04-17 10:55

在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 是一个字典。字典是无序的——简单来说,就是里面的东西没有固定的顺序,这个顺序也不是我们需要关心的细节。如果你深入了解字典的内部工作原理,会发现它的顺序会因为里面每个项的哈希值、插入的顺序等等而变化得很大,所以最好不要依赖于它的顺序。

撰写回答