![](/img/trans.png)
[英]asterisk in tuple, list and set definitions, double asterisk in dict definition
[英]Passing dict with boolean values to function using double asterisk
我有這樣的事情:
def x(**kwargs):
y(**kwargs)
def y(**kwargs):
print(kwargs)
d = {
'a': 1,
'b': True,
'c': 'Grace'
}
x(d)
使用調試器,我看到的行為是y()
中的kwargs
等於以下內容:
{
'kwargs': {
'a': 1,
'c': 'Grace'
}
}
我對雙星號的理解顯然是錯誤的,因為它應該打包和解壓縮鍵值對的字典,從而使您可以將字典作為關鍵字參數傳遞給方法。 但是,有兩件事使我感到困惑:
kwargs
鍵下? 理想情況下,我想避免這兩種行為,但顯然缺少有關這種雙星號行為的詳細信息的信息。
我不確定您的代碼的行為是什么,但是對我來說它會引發錯誤。 我們可以通過一個較小的示例得到相同的錯誤:
def x(**kwargs):
pass
d = {"a": 1, "b": 2}
x(d)
拋出:
TypeError: x() takes 0 positional arguments but 1 was given
問題很簡單,這不是**
語法的工作原理。 def x(**kwargs)
表示可以接受任意數量的命名變量的函數,如下所示:
def x(**kwargs):
print(kwargs)
x(a = 1, b = 2)
版畫
{'a': 1, 'b': 2}
但是,您將對象d
傳遞給它,換句話說,您將一個位置變量傳遞給函數-沒有命名變量。 因此,例外。
**
在語法上的另一種獨特用法是將kwargs字典拆包成一個函數,該函數已經以通常的方式定義為接受命名參數,例如:
def f(a, b):
print(a, b)
d = {"a": 1, "b": 2}
f(**d)
版畫
1 2
要完全掌握這一點,您應該在以下位置查看Python文檔中的教程:
https://docs.python.org/3/tutorial/controlflow.html#more-on-defining-functions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.