2014-07-07 116 views
0

我想了解以下內容。將字典傳遞給一個函數**

def exp(**argd): 
    print(argd) 

    a={1:'a',2:'b'} 
    exp(**a) 

This will give TypeError: exp() keywords must be strings. 

這工作正常,如果我使用a = {'1':'a','2':'b'}。爲什麼我無法將字典鍵作爲數字傳遞給exp函數?

+1

在python中檢查** kwargs http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python –

回答

3

exp(**a)在你的榜樣字面上擴展到exp(1='a', 2='b'),這是一個錯誤,因爲整數文字不能是變量名稱。

您可能會認爲,爲什麼**過程不將字符串轉換爲字符串作爲擴展的一部分?沒有一個單一的理由,但總的來說,Python的哲學是「顯式優於隱式」,隱式轉換可能有一些缺陷 - 例如,許多彼此不同的對象類型將轉換爲相同的字符串,如果您在擴展期間依靠隱式字符串強制轉換,可能會導致意想不到的後果。

+1

既不能''一個變量名''...但它會接受 –

+0

這是一個很好的點,實際上,我讀了你的答案之前我不知道的東西。我只能假設這是一個漏洞或不明確的行爲,而不是一種可接受的方式來創建通常無效的變量名稱! –

+0

我不同意......但是這個事實基本上使很多這個答案imho(這表示它仍然是一個堅實的答案)無效 –

2

,因爲你不能(圭多大概是唯一一個誰可以告訴你爲什麼)......這讓他們堅持局部變量的命名規則...的**a_dict拆包字典

a={1:'a',2:'b'} 
exp(**a) #is basically exp(1='a',2='b') 

這顯然是語法錯誤

雖然它允許有趣的事情像

a = {'a variable':7,'some$thing':88} 
exp(**a) 

只要他們是字符串...看來,他們執行的唯一規則是他們串...這是有可能保證他們是可哈希(一個巨大的猜測...)

免責聲明:這可能是一個過於簡單化