在python中,我编写了这个函数来教自己**kwargs
在Python中是如何工作的:
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
为什么for循环在a2的值之前打印a3的值,即使我先将a2输入到我的函数中?
答案 0 :(得分:24)
kwargs
是一本字典。字典是无序的 - 简单地说,订单是未指定的和实现细节。在引擎盖下偷看将显示订单变化很大,具体取决于项目的哈希值,插入顺序等,因此您最好不要依赖与之相关的任何内容。
答案 1 :(得分: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))))
答案 2 :(得分:6)
这最终在3.6 release中引入: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'])
答案 3 :(得分:5)
不幸的讽刺是,** kwargs的统一意味着以下行为不起作用(至少不是人们所期望的那样):
od = OrderedDict(a=1, b=2, c=3)
由于keyworded args首先构建在无序的dict中,因此您不能依赖它们按照列出的顺序插入到OrderedDict中。 :(
答案 4 :(得分:2)
由于kwargs
是一个Python 字典,它实现为hash table,因此其排序不会被保留,并且实际上是随机的。
实际上,作为许多编程语言中最近security issue的修复,将来订单甚至可能会在程序的调用之间发生变化(Python解释器的调用)。
答案 5 :(得分:1)
kwargs
是一个字典,在Python中它们没有排序,因此结果基本上是(伪)随机的。