2016-02-26 63 views
-3

我有一个看似简单的问题,我无法找到答案。 用一个简单的功能,如下列:在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明确定义。 我没有得到什么? 谢谢, 小号

+0

''b'没有在函数'test_kwargs_1'中声明,如错误所述。在函数中访问未定义的'kwargs'的方法是将其作为字典进行推理:'kwargs ['b']'。 –

+0

[Python *参数对\ * \ *(双星)和\ *(星)做什么的可能重复?](http://stackoverflow.com/questions/36901/what-does-double-star-and- star-do-for-python-parameters) – GingerPlusPlus

+0

感谢您的回复。这是我给自己的解释,但我觉得它有点不合逻辑。我认为,如果一个变量被声明或不会,传递** kwargs将解开kwargs字典中的内容,并有效地执行“a = 1”和“b = 2”。它实际上是“a = 1”,因为print(a)起作用,而“b”仍然是字典的关键字并且需要被访问。我明白一个函数应该如何给出警告(因为“b”可能不会被传递),但是在我看来,根据参数是否为位置来执行两个不同的事情。 – serrajo

回答

2

使用**kwargs在函数定义意味着你可以采取任何数量的关键字参数,你将他们都存储在名为kwargs字典。您可以使用kwargs['b']而不是b。

+0

感谢您的回复。令我惊讶的是,用“a”参数实际上做了我所期望的(即变量“a”可用,即使通过字典kwargs传递,而“b”不是)。在我看来,它根据变量是否为位置来做两件事情 – serrajo

+1

这与位置时相同。有了位置参数,你可以使用'* args',它不会带*全部*位置参数;它只会采用那些没有被考虑到的。这与'** kwargs'是一回事。 'a'已经占了,但'b'不是那么'kwargs'把它。 – zondo

+0

谢谢,现在更清楚了 – serrajo