Python.use(better) #OOP:辞書〔dict〕

記事一覧 Python.use(better)《Python3.1》《復刻版》

OOP:辞書〔dict〕

《著》真樹育未、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第1版♪1988/05/23 ● 第2版♪2001/01/29 ● 第3版♪2009/12/15

オブジェクト指向プログラミング〔OOP〕の基本概念の理解を深めます。
※ Python1.5 で作成した例題を、Python3.1 で再構成しました。

コンテナー(コレクション)

任意のオブジェクトを保持するコンテナー(コレクション)として、

  • シーケンス〔sequence〕
  • 写像〔map〕

が挙げられます。

辞書

■ 添字を利用するということ

添字(整数)を用いて各要素を参照すると、他の(長さが1の)文字列が得られます。この概念モデルを見ると、あたかも「整数と同じ名前の属性変数を介して、他の文字列を参照している」かのようです。リストとの違いは(添字を介して)参照できるのが「文字列」オブジェクトに限定されることです。

■ 文字列を連結するということ
>>> s0 = "A"+"B"; s0; id(s0)
'AB'
20275776
>>> s0 = "A"+"B"; s0; id(s0)
'AB'
20275776
>>> c0,c1 = s0; c0; id(c0); c1; id(c1)
'A'
1014432
'B'
1014464

変数 s0 の束縛を解いて、連結した文字列オブジェクト 'AB'(id:20275776)を解放しても、再束縛によって「同じ」文字列オブジェクト 'AB'(id:20275776)を参照します。これは、変数 s が束縛する文字列オブジェクトと同じものです。演算子 + によって連結された文字列は、要素として(長さが1の)文字列を保持するコンテナーと見なせます。

■ 変数を利用するということ
>>> 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'

これを見ると、メソッド呼び出しの「実引数」に指定したオブジェクトと、メソッドの本体で「仮引数」を介して参照されるオブジェクトとは、同一だと分かります。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/25