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オブジェクトを処理できるとか、
リストに限らず文字列でも大丈夫とかいったメリットはあるんだろうなぁ。
参考サイト
- 作者: Alex Martelli,Anna Martelli Ravenscroft,David Ascher,鴨澤眞夫,當山仁健,吉田聡,吉宗貞紀
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/06/26
- メディア: 大型本
- 購入: 11人 クリック: 423回
- この商品を含むブログ (85件) を見る