簡體   English   中英

Python字典參數傳遞方法

[英]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放在一起,將它們與spameggs參數匹配,並將所有剩余的內容存儲在**d中的新字典中參數。


所有這些都在教程中進行寬松解釋,在參考資料中進行更嚴格的解釋。

實際上,您在定義上有一個**d參數,而在調用中有一個**d參數,這並沒有什么特別的。 他們不必以任何方式相互對應。

有人認為不幸的是,Python對調用中的定義和參數解包中的變量參數參數使用相同的語法,並且對調用中的定義和關鍵字參數中的默認參數值使用相同的語法。 但是,盡管這在您第一次遇到它時會造成混亂,但是一旦您理解了它,就很容易記住和閱讀。 和其他以...args vs. seq...等語法區分兩者的語言,最初似乎並沒有造成任何混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM