【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[:]