about 4 years ago

1.Introduction

在python裡面, = 這個符號,
有可能是 pass by value 或是 pass by reference
如果 = 右方的 variablevalue , 例如 int
=pass by value ,如下

>>> x1=1
>>> x2=x1
>>> x1+=1
>>> print x1
2
>>> print x2
1

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

但如果 = 右方的 variableobject , 例如 list
這個時候 = 就只是把 pointer 複製而已

>>> y1=[]
>>> y2=y1
>>> print y2
[]

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

>>> y1+=[1]
>>> print y1
[1]
>>> print y2
[1]

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

2.copy.copy

先載入 copy 模組

>>> import copy

如果要把 variable 所指到的 object 一起複製,
而不是只複製 pointer , 就要用到 copy.copy

>>> y1=[]
>>> y2=copy.copy(y1)
>>> print y2
[]

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

>>> y1+=[1]
>>> print y1
[1]
>>> print y2
[]

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

但是如果是多層的 list ,
使用 copy.copy 就可能會出問題了
因為 copy.copy 只會複製一層的 object

>>> y0=[]
>>> y1=[y0]
>>> y2=copy.copy(y1)
>>> print y2
[[]]

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

>>> y0+=[1]
>>> print y0
[1]
>>> print y1
[[1]]
>>> print y2
[[1]]

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

3.copy.deepcopy

如果要把每一層所有的 object 都複製,
而不要複製 pointer
就要用 copy.deepcopy

>>> y0=[]
>>> y1=[y0]
>>> y2=copy.deepcopy(y1)
>>> print y2
[[]]

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

>>> y0+=[1]
>>> print y0
[1]
>>> print y1
[[1]]
>>> print y2
[[]]

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

4.Reference

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

← Python Standard Library -- argparse 自然語言處理 -- Hidden Markov Model →
 
comments powered by Disqus