Pythonクックブック(4章)

オブジェクトのコピー

Pythonでは明示的にしないと、オブジェクトのコピーはされない。
immutableオブジェクトの場合は気にしなくても良いけど、mutableオブジェクトの場合は気にしないといけない。
代入文は参照先の共有ってことに注意。

ビルドインクラスの場合、コピー元を引数としてビルドインクラスを呼び出すと、
シャローコピー相当のことができるなんてことは知らなかった。

>>> import copy
>>> list_a = [1, 2, 3]
# 参照先の共有
>>> list_b = list_a
# シャローコピー
>>> list_c = list(list_a)
>>> list_d = copy.copy(list_a)
# 参照先を共有しているので等価
>>> list_a is list_b
True
# シャローコピーして、新しいオブジェクトになっているので非等価
>>> list_a is list_c
False
>>> list_a is list_d
False
>>> list_a[0] = 10
# 参照先を共有してるので変更の影響を受けるが、新しいオブジェクトは影響を受けない
>>> list_a, list_b, list_c, list_d
([10, 2, 3], [10, 2, 3], [1, 2, 3], [1, 2, 3])
>>> 

ディクショナリ、集合もリスト同様に、dict(instance)、set(instance)でシャローコピー可能
集合の要素の追加はadd()メソッドで可能

>>> dict_a = {'a':1, 'b':2}
# シャローコピー
>>> dict_b = dict(dict_a)
>>> dict_a is dict_b
False
>>> set_a = set(list_a)
# シャローコピー
>>> set_b = set(set_a)
>>> set_a.add(4)
>>> set_a, set_b
(set([1, 2, 3, 4]), set([1, 2, 3])
>>> 

ずっと「集合はimmutable」って勘違いしてたけど、mutableなものとimmutableなものがある。
mutableなのがsetで、immutableなのがfrozenset。

リスト内包

リストの各要素に対して関数を実行するには、リスト内包表記ではなく、mapを使うべきと書いてある。
なんでだろう?速いのかな?

[kobakoba0723@fedora13-intel64 ~]$ cat test.py 
import timeit


list_a = [1, 2, 3]


def add_4(x):
    return x + 4


def use_list_comprehension():
    return [add_4(x) for x in list_a]


def use_map():
    return map(add_4, list_a)


if __name__ == '__main__':
    list_b1 = use_list_comprehension()
    list_b2 = use_map()
    print list_a, list_b1, list_b2

    print 'list_comprehension: %f' % timeit.Timer("use_list_comprehension()", "from __main__ import use_list_comprehension").timeit(number=100)
    print 'map function: %f' % timeit.Timer("use_map()", "from __main__ import use_map").timeit(number=100)
[kobakoba0723@fedora13-intel64 ~]$ python test.py 
[1, 2, 3] [5, 6, 7] [5, 6, 7]
list_comprehension: 0.000106
map function: 0.000119
[kobakoba0723@fedora13-intel64 ~]$ 

そうでもないなぁ。。。なんだろう。

map(function, iterable, ...)だから、複数個のiterableオブジェクトを処理できるとか、
リストに限らず文字列でも大丈夫とかいったメリットはあるんだろうなぁ。

参考サイト

組み込み型@Python 標準ライブラリ

Python クックブック 第2版

Python クックブック 第2版