Python.use(better) #OOP:集合〔set〕

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

OOP:集合〔set〕

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

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

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

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

  • シーケンス〔sequence〕
  • マップ〔map〕

が挙げられます。

集合

組み込み型 set は「集合」の概念を実現したものです。集合は、重複しない要素を列挙したもので、その順序には意味がありません。

■ 事例1:
>>> s = set("ABC"); s; id(s)
{'A', 'C', 'B'}
6710856
>>> s = set("ABC"); s; id(s)
{'A', 'C', 'B'}
6711336
>>> for e in s: e,id(e)
('A', 1014432)
('C', 1014496)
('B', 1014464)


変数 s の束縛を解いて、ある集合オブジェクト {'A', 'C', 'B'}(id:6710856)を解放すると、再束縛によって別の(同値な)集合オブジェクト {'A', 'C', 'B'}(id:6711336)を参照します。解放されたオブジェクトは回収されて、他のオブジェクトを生成するために再利用されます。

この概念モデルを見ると、あたかも「名前のない属性変数を介して、他の文字列を参照している」かのようです。そのため、リストと違って、各要素を参照するのに添字を利用できません。

■ 事例2:和集合
>>> s1 = set("AB")
>>> s2 = set("BC")
>>> s1; id(s1); s2; id(s2)
{'A', 'B'}
6445216
{'C', 'B'}
6711216
>>> for e in s1: e,id(e)
('A', 1014432)
('B', 1014464)
>>> for e in s2: e,id(e)
('C', 1014496)
('B', 1014464)

>>> ss = s1|s2; ss; id(ss)
{'A', 'C', 'B'}
6711336
>>> for e in ss: e,id(e)
('A', 1014432)
('C', 1014496)
('B', 1014464)


演算子 | によって得られた和集合オブジェクト {'A', 'C', 'B'}(id:6711336)は、各要素(長さが1の文字列)を保持するコンテナーと見なせます。

>>> id(set)
3321696
>>> id(set.__or__)
127224
>>> type(set.__or__)

■ 事例3:和集合
>>> a,b = "A","B"
>>> for e in a,b: e, id(e)
('A', 19738592)
('B', 19738528)
>>> s1 = set(a); s1; id(s1)
{'A'}
6711816
>>> s2 = set(b); s2; id(s2)
{'B'}
6711696
>>> ss = s1|s2; ss; id(ss)
{'A', 'B'}
6710856
>>> for e in ss: e,id(e)
('A', 1014432)
('B', 1014464)


演算子 | を利用するたびに、新たに生成した集合オブジェクト ss: {'A', 'B'}(id:6710856)が生成されます。ここで、着目して欲しいのは、

  • 演算子 | によって生成した集合が、要素として保持する文字列 "A","B" と、
  • 連結するために用意した、変数 a,b によって束縛される文字列 "A","B" とは、

別のオブジェクトになることです。

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


関連記事

Last updated♪2009/12/25