2017-05-08 62 views
1

dict.update([other])更新的Python字典與字符串的元組來設置(鍵,值)失敗

更新用鍵/值對的字典從其他,覆蓋現有的密鑰。退貨

update()接受另一個字典對象或鍵/值對的迭代(作爲元組或其他長度爲2的迭代)。如果指定了關鍵字參數,則字典隨後會使用這些鍵/值對進行更新:d.update(red = 1,blue = 2)。

>>> {}.update(("key", "value")) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: dictionary update sequence element #0 has length 3; 2 is required 

那麼,爲什麼Python的明顯嘗試使用元組的第一個字符串?

回答

1

的直接解決方案是這樣的:唯一的參數是other可選和元組(或長度的兩個其他iterables)的迭代

無參數(它是可選的,因爲當你不需要它:-)!

>>> d = {} 
>>> d.update() 
>>> d 
{} 

與元組列表(不與方括號包圍可選參數混淆):

>>> d = {} 
>>> d.update([("key", "value")]) 
>>> d 
{'key': 'value'} 

根據該Python glossary on iterables,一個元組(如所有序列類型)也可迭代,然而,這將失敗:

>>> d = {} 
>>> d.update((("key", "value"))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: dictionary update sequence element #0 has length 3; 2 is required 

Python documentation on tuple再次解決了這個謎:

注意,它實際上是使一個元組,而不是括號中的逗號。括號是可選的,除了在空元組情況下,或者當需要避免句法歧義時。

I.e. (None)是不是在所有元組,但(None,)是:

>>> type((None,)) 
<class 'tuple'> 

所以此工程:

>>> d = {} 
>>> d.update((("key", "value"),)) 
>>> d 
{'key': 'value'} 
>>> 

但這並不

>>> d = {} 
>>> d.update(("key", "value"),) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: dictionary update sequence element #0 has length 3; 2 is required 

因爲說句法歧義(逗號是函數參數分隔符)。