@
■ 変数を利用するということ
>>> a = "A"; a; id(a) 'A' 949600 >>> b = "B"; b; id(b) 'B' 578304 >>> s1 = a+b; s1; id(s1) 'AB' 20276064 >>> c0,c1 = s0; c0; id(c0); c1; id(c1) 'A' 1014432 'B' 1014464 >>> s2 = a+b; s2; id(s2) 'AB' 20276096 >>> c0,c1 = s0; c0; id(c0); c1; id(c1) 'A' 1014432 'B' 1014464
演算子 + を利用するたびに、新たに連結した文字列オブジェクト s1: 'AB'(id:20276064)および s2: 'AB'(id:20276096)が生成されます。ここで、着目して欲しいのは、
- 演算子 + によって連結された文字列が、要素として保持する文字列 "A","B" と、
- 連結するために用意した、変数 a,b によって束縛される文字列 "A","B" とは、
別のオブジェクトになることです。
《note》:連結した文字列オブジェクトを構成する要素として、どの(既存の)文字列オブジェクトを再利用するかについて、プログラマーは介入できません。
■ 演算子を利用するということ
>>> s3 = a.__add__(b); s3; id(s3) 'AB' 20276256 >>> c0,c1 = s0; c0; id(c0); c1; id(c1) 'A' 1014432 'B' 1014464 >>> id(str) 3331264 >>> id(str.__add__) 129064 >>> type(str.__add__)
演算子 + に呼応して、特殊メソッド __add__ が起動されます。
《note》演算子 + に呼応して、特殊メソッド __add__ が起動されるのは、次のようにして確認できます。
>>> class mystr(str): ... def __add__(self, other): ... print("__add__(self=%r, other=%r)"%(self, other)) ... print("self: %d, other: %d"%(id(self), id(other))) ... return super().__add__(other) >>> a = mystr("A") >>> b = "B" >>> a+b __add__(self='A', other='B') self: 19624936, other: 578304 'AB' >>> id(a); id(b) 19624936 578304 >>> a = str("A") >>> b = "B" >>> a+b 'AB'これを見ると、メソッド呼び出しの「実引数」に指定したオブジェクトと、メソッドの本体で「仮引数」を介して参照されるオブジェクトとは、同一だと分かります。□