[英]Python dictionary argument passing methods
我正在嘗試將字典作為參數傳遞,並看到如下所示的2種方法,是什么使它在與**傳遞時保持字典值不變
def dict_test1(**d):
d['a'] = '10'
def dict_test2(d):
d['a'] = '10'
d = {'a': '1'}
dict_test1(**d)
print d
dict_test2(d)
print d
輸出:
{'a': '1'}
{'a': '10'}
只是(**d)
創建了一個新dict
,而(d)
保留了對舊dict
的引用:
def dict_test1(**d):
print d is d_global # False
def dict_test2(d):
print d is d_global # True
d_global = {'a': '1'}
dict_test1(**d_global )
dict_test2(d_global)
要了解發生了什么,請考慮以下情況:
>>> def test1(**d):
... print(d)
>>> test1(spam=10)
{'spam': 10}
{'spam': 10}
是哪里來的? 簡單: **d
只是將與任何命名參數都不匹配的所有關鍵字參數(無論它們來自何處)打包到一個新的dict中,並為您提供d
。
現在,在參數側查看**
:
>>> def test2(spam, eggs):
... print(spam, eggs)
>>> d = {'eggs': 10, 'spam': 20}
>>> test2(**d)
20 10
因此,Python正在將**d
擴展為一堆單獨的關鍵字參數,它們與參數的匹配方式與實際的單獨關鍵字參數完全相同。
最后,雙方:
>>> def test3(spam, eggs, **d):
... print(spam, eggs)
... print(d)
>>> d = {'spam': 10, 'cheese': 20}
>>> test3(eggs=30, **d)
10 30
{'cheese': 20}
因此,Python將**d
參數擴展為兩個單獨的關鍵字參數,將它們與普通關鍵字參數eggs=30
放在一起,將它們與spam
和eggs
參數匹配,並將所有剩余的內容存儲在**d
中的新字典中參數。
所有這些都在教程中進行了寬松的解釋,在參考資料中進行了更嚴格的解釋。
實際上,您在定義上有一個**d
參數,而在調用中有一個**d
參數,這並沒有什么特別的。 他們不必以任何方式相互對應。
有人認為不幸的是,Python對調用中的定義和參數解包中的變量參數參數使用相同的語法,並且對調用中的定義和關鍵字參數中的默認參數值使用相同的語法。 但是,盡管這在您第一次遇到它時會造成混亂,但是一旦您理解了它,就很容易記住和閱讀。 和其他以...args
vs. seq...
等語法區分兩者的語言,最初似乎並沒有造成任何混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.