web-dev-qa-db-ja.com

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

Pythonで+ =が何をするのかを知る必要があります。それはとても簡単です。私はpythonの他の簡単なツールの定義へのリンクも感謝します。

90

Pythonでは、+ =は__iadd__特殊メソッドのためのシュガーコーティング、または__add__が存在しない場合は__radd__または__iadd__です。クラスの__iadd__メソッドはそれが望むことなら何でもすることができます。リストオブジェクトはそれを実装し、それを使用して、リストのextendメソッドが行うのと同じ方法で、各要素を自分自身に追加する反復可能なオブジェクトを反復処理します。

これが__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

お役に立てれば。

114
Bryan

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

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

-=*=/=は減算、乗算、除算についても同様です。

98
Imran

+=は変数に数値を追加して、プロセス内で変数自体を変更します(+は変更しません)。これと同様に、変数も変更する次のものがあります。

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

他にもあります。私はPythonプログラマーではありません。

26
Ryan Bigg

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

ここに注意してください。

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]

参考のために参照してください。 + =がリスト上で予期せず動作するのはなぜですか?

24
Roshan Mehta

左に右のオペランドを追加します。 x += 2x = x + 2を意味します

リストに要素を追加することもできます。 this SO thread を参照してください。

16
Kaleb Brasee

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

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

versus

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

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

14
C S

概念的にはa + = bはaにbを加算して結果をaに格納します。この単純化された記述は、多くの言語で+ =演算子を説明します。

しかしながら、単純化された記述はいくつかの問題を提起します。

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

Pythonでは、これら両方の質問に対する答えは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])

Tupleを使ってdostuffを呼び出すと、Tupleは+ =演算の一部としてコピーされるので、bは影響を受けません。しかし、リストと共にそれを呼び出すと、リストはその場で変更されるので、aとbの両方が影響を受けます。

Python 3では、 "bytes"と "bytearray"型でも同様の振る舞いが見られます。


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

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

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

7
plugwash
+= 

書くための単なる近道です

numbers = 1
numbers = numbers + 1
print (numbers)   ## 2

だから代わりに書くだろう

numbers = 1
numbers += 1
print (numbers)   ## 2

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

3
Vash

簡単な答えは、+=は、「+ =の右側にあるものを+ =の左側にある変数に追加する」と解釈できるということです。

a = 10がある場合、a += 5は次のようになります。a = a + 5

つまり、 "a"は15になります。

1
user10917993

昔の計算機で例えば2と3のように合計していたときに=を押すたびに合計に3が追加されるのを見ると+=が同じような働きをします。例:

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

他にも言われているように、+ =演算子は近道です。例:

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

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

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

そのため、最初の例を書く代わりに、2番目の例を書くことができます。これは問題なく動作します。

0
ZeroFunter