2012-05-08 28 views
10

python的許多方面似乎只是功能的重複。除了我在Python中的kwargs和dict中看到的冗餘之外是否還有一些差異?Python 3.2中的kwargs和dict有什麼區別?

+4

'** kwargs'隱式創建* A *'dict'對象(由'kwargs'命名)加載鍵和值。這不是重複的功能。 – 2012-05-08 00:40:49

+0

展開「許多方面」。還有哪些地方是重複功能? – jdi

回答

8

有作爲的論據之一拆包在參數的差異(其中許多人使用kwargs)和通過dict

  • 使用參數拆包:

    # Prepare function 
    def test(**kwargs): 
        return kwargs 
    
    # Invoke function 
    >>> test(a=10, b=20) 
    {'a':10,'b':20} 
    
  • 傳遞的字典爲一個參數:

    # Prepare function 
    def test(my_dict): 
        return my_dict 
    
    # Invoke function 
    >>> test(dict(a=10, b=20)) 
    {'a':10,'b':20} 
    

的區別主要是:

  • 可讀性(你可以簡單地通過關鍵字參數,即使他們沒有明確定義),
  • 靈活性(可以明確地支持一些關鍵參數,並使用**kwargs休息) ,
  • 參數拆包可以幫助你避免「含有」的觀點(這是不那麼重要,因爲Python的一般假設開發人員知道他們在做什麼,這是一個不同的主題)的對象意想不到的變化,
+4

隨着解壓縮,密鑰需要有效的標識符 –

+0

@gnibbler:你說得對,+1。我完全錯過了。作爲一個例子,我會給'test({0:10,'0':20})(這會返回'{0:10,'0':20}'),這很難用參數解包來替換。 – Tadeck

3

這是正確的,在大多數情況下,你可以交換字典和** kwargs。

例如:

my_dict = {'a': 5, 'b': 6} 
def printer1(adict): 
    return adict 
def printer2(**kwargs): 
    return kwargs 

#evaluate: 
>>> printer1(my_dict) 
{'a': 5, 'b': 6} 
>>> printer2(**my_dict) 
{'a': 5, 'b': 6} 
用,如果你與其他參數結合起來,你有更多的靈活性kwargs

但是:

def printer3(a, b=0, **kwargs): 
    return a,b,kwargs 

#evaluate 
>>> printer3(**my_dict) 
(5, 6, {}) 
相關問題