のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

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]]