2017-05-08 14 views
1

dict.update([other])を失敗し更新Pythonの辞書

は、既存のキーを上書きし、からキー/値のペアを持つ辞書を更新言います。返品なし

update()は、別の辞書オブジェクトまたはキー/値ペアの繰り返し可能なもの(タプルまたは長さ2の他のiterable)を受け入れます。キーワードの引数が指定されている場合、d.update(赤= 1、青= 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任意及びタプル(または長さ2の他のイテレート可能オブジェクト)の反復可能あります。

引数なし(それはあなたが:-)それを必要としないときのために、オプションです:!

:タプル(オプションの引数を囲む角括弧でこれを混同していない)と

>>> 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はこの謎を解く:

注それは実際にはタプルではなく、括弧を作るコンマであること。かっこは、空のタプルの場合を除いて、または構文上のあいまいさを避けるために必要な場合を除き、オプションです。

e.e.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 

ないがカンマは関数の引数のセパレータです)。