初めてのPython(9章後半)

ビルドインオブジェクトの分類

カテゴリ 変更性
数値 数値 immutable
文字列 シーケンス immutable
リスト シーケンス mutable
ディクショナリ 写像 mutable
タプル シーケンス immutable
ファイル エクステンション immutable
集合 集合 immutable

リファレンスとコピー

コピーにはディープコピーとシャローコピーの2種類が存在する。
違いは、コピー元のオブジェクトの扱いが複製なのか参照なのか。
参考:だるまのVBA, Pythonライブラリリファレンス

コピーの種類 コピー元オブジェクトの扱い コピー方法
ディープコピー 複製 copy.deepcopy()
シャローコピー 参照 copy.copy(), list[:], dict.copy()

スライシングすると複製が出来ると思ってたけど、トップレベルのみ複製で、後は参照がコピーされる。

(ディープコピー)
変数とオブジェクトの関係は次のようになる

>>> A = [1, 2, 3]
>>> B = [A, 4, 5, 6]
>>> import copy
>>> C = [copy.deepcopy(B), 7, 8, 9]
>>> A
[1, 2, 3]
>>> B
[[1, 2, 3], 4, 5, 6]
>>> C
[[[1, 2, 3], 4, 5, 6], 7, 8, 9]
>>> C[0][0][0] = 5
>>> A
[1, 2, 3]
>>> B
[[1, 2, 3], 4, 5, 6]
>>> A
[1, 2, 3]
>>> A[0] = 10
>>> A
[10, 2, 3]
>>> B
[[10, 2, 3], 4, 5, 6]
>>> C
[[[5, 2, 3], 4, 5, 6], 7, 8, 9]
>>> 

(シャローコピー)
変数とオブジェクトの関係は次のようになる

[kobakoba0723@fedora13-intel64 ~]$ python
Python 2.6.4 (r264:75706, Apr  1 2010, 02:55:51) 
[GCC 4.4.3 20100226 (Red Hat 4.4.3-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> A = [1, 2, 3]
>>> B = [A, 4, 5, 6]
>>> C = [B[:], 7, 8, 9]
>>> A
[1, 2, 3]
>>> B
[[1, 2, 3], 4, 5, 6]
>>> C
[[[1, 2, 3], 4, 5, 6], 7, 8, 9]
>>> C[0][0][0] = 5
>>> C
[[[5, 2, 3], 4, 5, 6], 7, 8, 9]
>>> B
[[5, 2, 3], 4, 5, 6]
>>> A
[5, 2, 3]
>>> A[0] = 10
>>> A
[10, 2, 3]
>>> B
[[10, 2, 3], 4, 5, 6]
>>> C
[[[10, 2, 3], 4, 5, 6], 7, 8, 9]
>>> 

オブジェクトの比較とTrue/False

Pythonのオブジェクトは全て比較演算の対象にでき、大小比較は以下のルールに基づいて行われる

  • 数値は、数値自体の大きさで比較
  • 文字列は、1文字ずつ比較し、アルファベット順が後ほど大きい
  • ディクショナリはキーと値からなるリストとみなされ、要素が順に比較される(各要素について、キー→値の順で比較し、同じなら次の要素)
  • 複合オブジェクトは左から右の順に1つずつ、ネストされていれば一番低い階層まで順に比較する
>>> D1 = {'dict':1, 'list':2}
>>> D2 = {'list':1, 'dict':2}
>>> D1 < D2
True
>>> D2 = {'dict':2, 'list':2}
>>> D1 < D2
True
False
>>> D2 = {'dict':1, 'lists':2}
>>> D1 < D2
True
>>> D2 = {'dict':1, 'list':3}
>>> D1 < D2
True
>>> D2 = {'cat':3, 'list':3}
>>> D1 < D2
False
>>> L1 = [[[1], 2, 3], 4, 5, 6]
>>> L2 = [[[10], 2, 3], 4, 5, 6]
>>> L1 < L2
True
>>> L2 = [[[0], 10, 3], 4, 5, 6]
>>> L1 < L2
False
>>> 

True/Falseの判定基準は以下

  • 数値は0でなければTrue
  • その他のオブジェクトは空でなければTrue
  • NoneはFalse([None]はTrue)