2016-08-16 8 views
3

Python言語の標準dictクラスが '+'や '+ ='などの加算/減算演算子をサポートしていない理由について戸惑っています。Python辞書が '+'演算子をサポートしない理由

>>> foo = {'a': 1, 'b': 2} 
>>> bar = {'c': 3, 'd': 4} 

>>> foo + bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +: 'dict' and 'dict' 

私の希望的観測ではなく、以下の結果を次のようになります。

>>> foo + bar 
{'a': 1, 'b': 2, 'c': 3, 'd': 4} 

同様に、なぜself.__update__(other)と同じではない__radd__(self, other)結果のでしょうか?

>>> foo += bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for +=: 'dict' and 'dict'  

既定の動作の歴史的な理由を知っている人はいますか?

(私はfoobarが同じキーが異なるキー値を持つシナリオで使用されるべき値で曖昧なことができることを認める)

+1

あなたのかっこの譲歩は、あなたの質問に対するかなり良い答えだと思います。 '+'はあいまいな瞳孔を表現するための誤った方法になります。 – khelwood

+6

出力が些細なものではなかったためです。両方の辞書が同じキーを持っているとどうなりますか?例外?値は最初の辞書から取られますか?多分二番目から?明確に定義されていないため、実装されていません。 – DeepSpace

+7

[こちらをご覧ください] – Sevanteri

答えて

1

誰もがデフォルトの動作のための歴史的な理由を知っていますか?

グイド・ヴァンロッサムは、彼が更新()より良いが好きで、+オペレータがコードに明確に読んでいないだろうと考えているとコメント。

FWIW、彼はスターアンパック一般化を使用してそれを行うには、あなたの別の方法を与えるPEP 448を承認しました:

>>> a = {'a': 1, 'b': 2} 
>>> b = {'c': 3, 'b': 4} 
>>> {**a, **b} 
{'a': 1, 'b': 4, 'c': 3} 

+は良いアイデアではないかもしれないいくつかの理由があります。通常、加算は可換であると予想しますが、重複するキーが別個の値を持つたびに加算が失敗します。 "通常の"ユースケースは、dictをインプレースでのみ更新することですが、通常の意味は+で、両方の入力の内容をコピーして新しいdict(いくらか無駄です)を作成します。

さらに、Pythonには複写の代償として、複数のルックアップを持つ可能性のある新しい費用がかかっているcollections.ChainMapがあります。