1. 程式人生 > >python直接賦值、深拷貝和淺拷貝

python直接賦值、深拷貝和淺拷貝

python中,物件賦值實際上是物件的引用。當建立一個物件,將其賦值給另一個變數,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。 所以如果從單純的賦值語句來實現clone物件的話, 那可能bug出現的也會莫名其妙. Python中可以使用copy模組來複制物件.


copy.copy 為淺拷貝, 只copy父物件, 不會拷貝物件內部的子物件。

11830691-47acf752de56491a.png 淺拷貝

copy.deepcopy 深拷貝, 拷貝物件及其子物件。

>>> import copy
>>> a = [1,2,3,4,['a','b']]
>>> b = a                    # 賦值拷貝
>>> c = copy.copy(a)         # 淺拷貝, 只拷貝了a的引用, 內部元素沒有拷貝.
>>> d = copy.deepcopy(a)     # 深拷貝, 完全拷貝
>>>
>>> a.append(5)       
>>> a[4].append('c')
>>>
>>> print 'a=',a
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
>>> print 'b=',b
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]   #賦值拷貝, 記憶體地址指向一樣的。 相當於一個人的兩個名字而已.
>>> print 'c=',c
c= [1, 2, 3, 4, ['a', 'b', 'c']]      #淺拷貝, 子元素c[4]引用的地址和a[4]是一樣的. 所以改變a[4]相當於改了c[4].
>>> print 'd=',d
d= [1, 2, 3, 4, ['a', 'b']]           #深拷貝完全拷貝. a和d完全改變了.