在python中使用额外的** kwargs:如何访问额外的变量?
问题描述:
我有一个看似简单的问题,我无法找到答案。 用一个简单的功能,如下列:在python中使用额外的** kwargs:如何访问额外的变量?
def test_kwargs_1(a,**kwargs):
print a
print b
我在想,如果我通过:
kwargs = {'a':1,'b':2}
test_kwargs_1(**kwargs)
它会打印:
1
2
,因为它会解压“kwargs “并且变量”a“和”b“都可用。 相反,我得到:
1
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
.
.
----> 3 print b
NameError: global name 'b' is not defined
据我所知,“B”是可以或者可能不存在一个变量,但我认为kwargs的拆包将使变量“b”可如果kwargs明确定义。 我没有得到什么? 谢谢, 小号
答
使用**kwargs
在函数定义意味着你可以采取任何数量的关键字参数,你将他们都存储在名为kwargs
字典。您可以使用kwargs['b']
而不是b。
''b'没有在函数'test_kwargs_1'中声明,如错误所述。在函数中访问未定义的'kwargs'的方法是将其作为字典进行推理:'kwargs ['b']'。 –
[Python *参数对\ * \ *(双星)和\ *(星)做什么的可能重复?](http://stackoverflow.com/questions/36901/what-does-double-star-and- star-do-for-python-parameters) – GingerPlusPlus
感谢您的回复。这是我给自己的解释,但我觉得它有点不合逻辑。我认为,如果一个变量被声明或不会,传递** kwargs将解开kwargs字典中的内容,并有效地执行“a = 1”和“b = 2”。它实际上是“a = 1”,因为print(a)起作用,而“b”仍然是字典的关键字并且需要被访问。我明白一个函数应该如何给出警告(因为“b”可能不会被传递),但是在我看来,根据参数是否为位置来执行两个不同的事情。 – serrajo