almost 9 years ago
1.Introduction
在python裡面, =
這個符號,
有可能是 pass by value 或是 pass by reference
如果 =
右方的 variable 是 value , 例如 int
則 =
是 pass by value ,如下
>>> x1=1
>>> x2=x1
>>> x1+=1
>>> print x1
2
>>> print x2
1
我們讓 x2=x1
, 但 x1
的值變了, x1
的值不變
但如果 =
右方的 variable 是 object , 例如 list
這個時候 =
就只是把 pointer 複製而已
>>> y1=[]
>>> y2=y1
>>> print y2
[]
如上圖, y2
和 y1
共同指向一個 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
改變了, y1
和 y2
都會變
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
不會變