Pythonのリストをコピーする。知らないと結構困るかも!?
Sponsored Links
皆さんこんにちは
お元気ですか。私は元気です。が。。。。酒飲むと寝れないね。
C++だと関数への引数の指定でコピーだが参照渡しだが、ポインタを決めることができます。
int add(a,b){ a = a + b; } int add(&a,b){ a = a - b; }
このような例の場合、上記の&なしでは元の関数には影響を及ぼさないのですが、なんとPython先生では影響が出るそうなのです。
今更かい!と思うかもしれませんが、重要なので、調査しました。
>>> def add(a,b): ... a = a + b ... >>> a = 3 >>> b = 10 >>> add(a,b) >>> a 3
うん、普通だね。本当に
>>> def addList(array): ... array.append(10) ... >>> list = [] >>> addList(list) >>> list [10]
!?,参照で渡されている…。気をつけないと危ない。これどうやってコピーするの?と思って探しているとあった
>>> cp = list[:] >>> cp_n = list >>> addList(list) >>> cp_n [10, 10] >>> cp [10]
これでようやくコピーができるらしい。因みに二次元配列だと上記のやり方ではコピーできないそうな。deepcopyを使いましょう。
>>> from copy import deepcopy >>> lists = [[1,2,3,4],[3,4,5,6],[6,7,8,9]] >>> cp_lists = lists[:][:] >>> cp_lists_d = deepcopy(lists) >>> addList(lists[0]) >>> lists [[1, 2, 3, 4, 10], [3, 4, 5, 6], [6, 7, 8, 9]] >>> cp_lists [[1, 2, 3, 4, 10], [3, 4, 5, 6], [6, 7, 8, 9]] >>> cp_lists_d [[1, 2, 3, 4], [3, 4, 5, 6], [6, 7, 8, 9]]