Pythonの+ =

 

リードへ

今日は(私は~~奇妙な現象に遭遇した何歳)奇妙な現象があった、実行する前に、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没有实现减法和除法的操作。但乘法确实也是这样。

好吧,之后再进行对象运算符重载时可以参考一下上面的做法,仔细想想还是很合乎逻辑的。

おすすめ

転載: www.cnblogs.com/hujingnb/p/12037636.html