初めての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)