2016-02-26 68 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