+ =がpythonで何をするかを知る必要があります。とても簡単です。私はまた、Pythonの他のショートハンドツールの定義へのリンクを歓迎します。
+ =がpythonで何をするかを知る必要があります。とても簡単です。私はまた、Pythonの他のショートハンドツールの定義へのリンクを歓迎します。
回答:
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
お役に立てれば。
__iadd__
、別のタイプ(それ自体は追加可能)を返す-1の場合
+=
変数の値で別の値を追加し、新しい値を変数に割り当てます。
>>> x = 3
>>> x += 2
>>> print x
5
-=
、*=
、/=
減算、乗算、除算のための類似し。
x += 5
x = x + 5
Pythonで言うのとまったく同じではありません。
ここで注意してください:
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
+=
変数に数値を追加し、プロセス内で変数自体を変更します(+
そうでない場合)。これと同様に、変数も変更する次のものがあります。
-=
、変数から値を減算し、変数を結果に設定します*=
、変数と値を乗算し、結果を変数にします/=
、変数を値で除算し、結果を変数にします%=
、変数に対してモジュラスを実行し、変数はその結果に設定されます他にもあるかもしれません。私はPythonプログラマではありません。
これは単なる構文上のショートカットではありません。これを試して:
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を呼び出すことを示しています。
概念的には、a + = bはaにbを「追加」して、結果をaに格納します。この単純な説明では、多くの言語で+ =演算子を説明します。
ただし、単純化した説明では、いくつかの疑問が生じます。
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]の再割り当てに失敗すると、例外が発生します。
短い答えは+=
、「+ =の左側にある変数に、+ =の右側にあるものをすべて追加する」と翻訳できます。
例 あなたがしているa = 10
場合a += 5
は: a = a + 5
つまり、「a」は15になります。
演算子の優先順位が右側が常に最初に評価されるという事実と組み合わされているため、追加の演算子が含まx += y
れx = 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
object.__iadd__