+ =はPythonで正確に何をしますか?


118

+ =がpythonで何をするかを知る必要があります。とても簡単です。私はまた、Pythonの他のショートハンドツールの定義へのリンクを歓迎します。



2
Python(および他の多くの言語も)の基本的な演算子です。Pythonのリファレンスを一度も読んだことがない場合は、googleから始めてください。
テクノマージュ2011年

3
@AndiDogどちらの質問も(+ =)演算子に関するものですが、あなたがリンクした質問は、洗練された使用法と微妙な問題に関するものであり、ここのOPはおそらく(まだ)そこの推論をたどることができません。
belisarius博士、2011年

3
@AndiDogおそらくあなたはその時点で正しかったかもしれませんが、ここで(ほとんど)受け入れられているソリューションを見ると、この質問はオペレーターの基本的な理解に関するものであることは明らかです:D
Dr. belisarius

1
ほとんどのsumbolの使用は、シンボルページdocs.python.org/3/genindex-Symbols.htmlでインデックス化されています。
Terry Jan Reedy 2014年

回答:


148

Pythonでは、+ =用糖コーティングである__iadd__特別な方法、または__add__あるいは__radd__場合は__iadd__存在しません。__iadd__クラスのメソッドは、必要なことは何でもできます。リストオブジェクトはそれを実装し、それを使用して、リストの拡張メソッドが行うのと同じ方法で、各要素をそれ自体に追加する反復可能なオブジェクトを反復します。

__iadd__特別なメソッドを実装する単純なカスタムクラスを次に示します。オブジェクトをintで初期化し、+ =演算子を使用して数値を追加できます。__iadd__呼び出されることを示すために、printステートメントを追加しました。また、__iadd__オブジェクトを返すことが期待されているため、この場合に意味のあるそれ自体と他の数値の加算を返しました。

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

お役に立てれば。


24
これはアスカーが探していたものではありませんが、実際の答えは+1です。=)
マイケル

@マイケル、ユーモアが事実に加わるところです... :-D
アーロンジョンサブ

3
質問に答える場合は+1 __iadd__、別のタイプ(それ自体は追加可能)を返す-1の場合
Caleth

この答えは、+ =の意味を尋ねる必要がある人(つまり、初心者)にとっては複雑すぎます。あなたの答えは初心者の答えではありません。初心者は通常、オブジェクト指向の方法でPythonの学習を開始しないためだけでなく、より単純な答え(@Imranの以下のような)もあるからです。私はこの答えに感謝していますが、ちょうど私の2セント。
q-compute

129

+= 変数の値で別の値を追加し、新しい値を変数に割り当てます。

>>> x = 3
>>> x += 2
>>> print x
5

-=*=/=減算、乗算、除算のための類似し。


19
整数は不変なので、「それ自体」は実際には非常に悪い説明です。
AndiDog 2011年

41

x += 5x = x + 5Pythonで言うのとまったく同じではありません。

ここで注意してください:

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

参照してください:リストで+ =が予期しない動作をするのはなぜですか?


ただし、奇妙なケースを除いて、同じですx += 7,8,9
Ufos

また、リンクされたスレッドの1つは、それが正確にどこで異なるかについての良い議論を提供します。stackoverflow.com/questions/6951792/…–
Ufos

31

+=変数に数値を追加し、プロセス内で変数自体を変更します(+そうでない場合)。これと同様に、変数も変更する次のものがあります。

  • -=、変数から値を減算し、変数を結果に設定します
  • *=、変数と値を乗算し、結果を変数にします
  • /=、変数を値で除算し、結果を変数にします
  • %=、変数に対してモジュラスを実行し、変数はその結果に設定されます

他にもあるかもしれません。私はPythonプログラマではありません。


2
数字の場合、この答えは正しいです。(参照ブライアンの答え特殊な動作のために。)があり、実際あるビット演算子(含むいくつかの他、&=>>=、など)と追加の数学演算子(**=など)。
マイケル


15

これは単なる構文上のショートカットではありません。これを試して:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

これは、+ =がiaddリストメソッドを呼び出すのに対し、+はリストに対して異なる処理を行うaddを呼び出すことを示しています。


7

概念的には、a + = bはaにbを「追加」して、結果をaに格納します。この単純な説明では、多くの言語で+ =演算子を説明します。

ただし、単純化した説明では、いくつかの疑問が生じます。

  1. 「追加」とはどういう意味ですか?
  2. 「結果をaに保存する」とはどういう意味ですか?Python変数は値を直接格納せず、オブジェクトへの参照を格納します。

Pythonでは、これらの両方の質問に対する答えは、aのデータ型によって異なります。


では、「追加」とは正確にはどういう意味ですか?

  • 数値の場合、数値の加算を意味します。
  • リスト、タプル、文字列などの場合は、連結を意味します。

リストの場合、+ =は+よりも柔軟性があるため、リストの+演算子には別のリストが必要ですが、+ =演算子はイテラブルを受け入れます。


では、「値をaに格納する」とはどういう意味ですか?

オブジェクトが変更可能な場合は、変更をインプレースで実行することをお勧めします(必須ではありません)。つまり、aは以前と同じオブジェクトを指していますが、そのオブジェクトは異なるコンテンツを持っています。

オブジェクトが不変である場合、変更をインプレースで実行することはできません。一部の変更可能なオブジェクトには、インプレース「追加」操作の実装がない場合もあります。この場合、変数 "a"は、追加操作の結果を含む新しいオブジェクトを指すように更新されます。

技術的には、これは__IADD__最初に探すことによって実装されます。実装されていない場合__ADD__は、最後に試行され__RADD__ます。


正確な型がわからない変数、特に型が可変かどうかがわからない変数でPythonで+ =を使用する場合は注意が必要です。たとえば、次のコードを考えます。

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

タプルでdostuffを呼び出すと、タプルは+ =操作の一部としてコピーされるため、bは影響を受けません。ただし、リストを指定して呼び出すと、リストは適切に変更されるため、aとbの両方が影響を受けます。

Python 3では、「bytes」および「bytearray」タイプで同様の動作が観察されます。


最後に、オブジェクトが置き換えられない場合でも、再割り当てが行われることに注意してください。左側が単に変数である場合、これは重要ではありませんが、たとえば、可変コレクションを参照する不変コレクションがある場合、混乱を招く可能性があります。

a = ([1,2],[3,4])
a[0] += [5]

この場合、[5]はa [0]が参照するリストに正常に追加されますが、その後、コードがa [0]の再割り当てに失敗すると、例外が発生します。


5

短い答えは+=、「+ =の左側にある変数に、+ =の右側にあるものをすべて追加する」と翻訳できます。

例 あなたがしているa = 10場合a += 5は: a = a + 5

つまり、「a」は15になります。


この回答は、まだ議論されていないことは何に貢献していますか?重複した回答です...

jdv、ただ助けようとしています。私は新しい寄稿者なので、私の答えが重複していると思われる場合は申し訳ありません。

他の回答のほとんどを見ると、それが重複していることは明らかです。貢献することは問題ありませんが、何か新しいものに貢献するために努力する必要があります(たとえば、addとiaddの回答のように)、またはより明確な解決策を試したい場合。しかし、私が知る限り、トップ投票の回答は、基本的な回答を得るのと同じくらい明確です。

4

演算子の優先順位が右側が常に最初に評価されるという事実と組み合わされているため、追加の演算子が含まx += yx = x + yているいくつかの状況と同じではないことに注意してください。

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

最初のケースが次のように展開されることに注意してください。

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

あなたは他のオペレーターと「現実世界」でこれに遭遇する可能性が高くなります、例えば

x *= 2 + 1== x = x * (2 + 1)!=x = x * 2 + 1


4

+= 書くための近道です

number = 4
number = number + 1

代わりにあなたは書くでしょう

numbers = 4
numbers += 1

どちらの方法も正しいですが、例2は少し少ないコードを書くのに役立ちます


1
動作は数値で同じですが、一般的に同じではありません。
プラグウォッシュ

0

他の人も言ったように、+ =演算子はショートカットです。例:

var = 1;
var = var + 1;
#var = 2

次のように書くこともできます:

var = 1;
var += 1;
#var = 2

したがって、最初の例を書く代わりに、2番目の例を書くだけで問題なく動作します。


0

たとえば、古い計算機で2と3を合計するのに使用したときは、ヒットするたびに=合計に3が追加されるのを確認してください+=。例:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

複数の整数で+ =を使用してもうまくいかない答えがたくさんあります。

一例:

x -= 1 + 3

これは次のようになります。

x = x - (1 + 3)

ではなく:

x = (x - 1) + 3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.