リードへ
今日は(私は~~奇妙な現象に遭遇した何歳)奇妙な現象があった、実行する前に、Pythonスクリプトを書きました。コードは、おそらく長い道のりでした。
= A [1、2 ,. 3 ] B = [4 ,. 5 ,. 6 ] #...ロジックの大部分 C = A C + = Bの #...大部分の論理 #ここで、[なります1、2、3、4、5、6]
まず、上記のコードが長すぎる機能、そして、それはとんでもないです
これは、一度シーンで、私は期待通りのプログラムを実行したくありませんでした。私たちは、変数または割り当ての変更を見つけることができませんでした、長い時間を探しています。
参照割り当ては、オブジェクトのリストであるため、直接変数を変更するため、最終的に、それらは、C変数の中央に隠さ見出さ。私はプリントアウト二つの変数に対処します、確かにケースです。
もともと、私は基本的に事件を解決ここで見つけます。我々は従うべきではありません
しかし、私はインターネットを少し確認し、それは= +起こらないと言われていた、私軽蔑笑い、違いは何ですか?何も私はそれを試してみました。
何?誰もが何が起こったのかを教えてもらえますか?
プローブ
私の推測によると、+ =演算子を変更しなければならない本来の目的である、= +演算子は、新しいオブジェクトを返します。試してみてください。
確かに。この検出で。
疑問
操作の過負荷既知のPython演算子は、加算呼び出される__add__
+ =が呼び出されると、メソッドの__iadd__
方法。今、この現象を生み出すこと、それがなければなりませんlist
わずかに異なる2つの方法の達成。
自分でテストしてみてください、書くTest
道具2つのオーバーロードされたメソッドというクラスを:
それぞれ呼び出す+=
と=+
:
あなたはそれが新しい値であり、見ることができます。あなたは、実装の方法を変更した場合:
再测试就会发下,两个运算返回的都是同一个对象。水落石出,Python对两个不同的运算符使用了不同的实现方法。
一探究竟
那为什么Python会在 +=
操作时,直接修改原对象。而=+
操作却要返回新的对象呢?
简单推测一下,可能Python的作者认为,+=
操作是要将后边的值加到自身上。而+
则是两个值的运算操作。根据表达是也可以看出:
a += b # 这里只涉及两个变量,将b的内容直接加到a上 c = a + b # 这里涉及到了三个变量,将后两者内容相加后赋值给新的变量
最后,既然+=
和=+
的实现不同,那么同理列表的-=
和=-
、*=
和=*
、/=
和=/
的实现也必然不同。
哦,不好意思,list
没有实现减法和除法的操作。但乘法确实也是这样。
好吧,之后再进行对象运算符重载时可以参考一下上面的做法,仔细想想还是很合乎逻辑的。