Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Python】配列コピーについて

こんばんは、葛の葉です。

さて、Pythonの配列のコピーについて、書きます。

環境

Python3.6.6

コード達

Python 3.6.6 (default, Sep  5 2018, 03:40:52)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,3,4,5]
>>> b = a
>>> a
[1, 2, 3, 4, 5]
>>> b
[1, 2, 3, 4, 5]
>>> a[0] = 6
>>> a
[6, 2, 3, 4, 5]
>>> b
[6, 2, 3, 4, 5] #←b[0]が変更されている
>>> id(a)
140405585847624
>>> id(b)
140405585847624
>>> id(a) == id(b)
True
#IDの値は全く同じである。

配列の中身をコピーしているわけではなく、配列として参照しているアドレスをコピーしているため。

配列をコピーしたい場合

import copyを用いたコピー

c配列

>>> import copy
>>> c = copy.deepcopy(a)
>>> id(c)
140405578255624
>>> id(a) == id(c)
False #<- IDが異なる
>>> c
[6, 2, 3, 4, 5]
>>> c[0] = 7
>>> c
[7, 2, 3, 4, 5]
>>> a
[6, 2, 3, 4, 5]
>>> a
[6, 2, 3, 4, 5]
>>> b
[6, 2, 3, 4, 5]
>>> c
[7, 2, 3, 4, 5]
>>> a[0] = 8
>>> a
[8, 2, 3, 4, 5]
>>> b
[8, 2, 3, 4, 5]
>>> c
[7, 2, 3, 4, 5]

スライス[:]を用いたコピー

d配列

>>> d = a[:]
>>> d
[8, 2, 3, 4, 5]
>>> d[0] = 9
>>> d
[9, 2, 3, 4, 5]
>>> a
[8, 2, 3, 4, 5]
>>> id(d)
140405578255688
>>> id(d) == id(a)
False
>>> id(d) == id(a)
False

結論

リストをコピーするときは

import copy
new_array = copy.deepcopy(array)

または

new_array = array[:]