Mark Chang's Blog

Machine Learning, Deep Learning and Python

Python Copy

1.Introduction

在python裡面, = 這個符號,

有可能是 pass by value 或是 pass by reference

如果 = 右方的 variablevalue , 例如 int

=pass by value ,如下

1
2
3
4
5
6
7
8
>>> x1=1
>>> x2=x1
>>> x1+=1
>>> print x1
2

>>> print x2
1

p1

我們讓 x2=x1 , 但 x1 的值變了, x1 的值不變

但如果 = 右方的 variableobject , 例如 list

這個時候 = 就只是把 pointer 複製而已

1
2
3
4
>>> y1=[]
>>> y2=y1
>>> print y2
[]

p2

如上圖, y2y1 共同指向一個 list ,

1
2
3
4
5
6
>>> y1+=[1]
>>> print y1
[1]

>>> print y2
[1]

p3

如果 y1 改變, y2 也一起改變

2.copy.copy

先載入 copy 模組

1
>>> import copy

如果要把 variable 所指到的 object 一起複製,

而不是只複製 pointer , 就要用到 copy.copy

1
2
3
4
>>> y1=[]
>>> y2=copy.copy(y1)
>>> print y2
[]

p4

如上圖, y1 所指的 list 也被複製了

1
2
3
4
5
6
>>> y1+=[1]
>>> print y1
[1]

>>> print y2
[]

p5

所以當 y1 改變的時候, y2 不變

但是如果是多層的 list ,

使用 copy.copy 就可能會出問題了

因為 copy.copy 只會複製一層的 object

1
2
3
4
5
>>> y0=[]
>>> y1=[y0]
>>> y2=copy.copy(y1)
>>> print y2
[[]]

p6

複製超過一層以後,剩下的就只複製 pointer, 如上圖:

1
2
3
4
5
6
7
8
9
>>> y0+=[1]
>>> print y0
[1]

>>> print y1
[[1]]

>>> print y2
[[1]]

p7

這個時候 y0 改變了, y1y2 都會變

3.copy.deepcopy

如果要把每一層所有的 object 都複製,

而不要複製 pointer

就要用 copy.deepcopy

1
2
3
4
5
>>> y0=[]
>>> y1=[y0]
>>> y2=copy.deepcopy(y1)
>>> print y2
[[]]

p8

如上圖, copy.deepcopy 會把每層的 object 都複製

1
2
3
4
5
6
7
8
9
>>> y0+=[1]
>>> print y0
[1]

>>> print y1
[[1]]

>>> print y2
[[]]

p9

這個時候若 y0 改變了, 只有 y1會變 , 而 y2 不會變

4.Reference

https://docs.python.org/2/library/copy.html

Comments