python中提供了copy這個(gè)模塊來(lái)對(duì)變量進(jìn)行淺拷貝和深拷貝。
淺拷貝
python 中變量有三個(gè)重要的屬性,id(內(nèi)存地址),值和類(lèi)型吱殉。
淺拷貝就是創(chuàng)建一個(gè)新id的變量,它的值和類(lèi)型和拷貝對(duì)象的相同厘托。
當(dāng)值中存在對(duì)其他對(duì)象的引用時(shí)友雳,原變量和新變量的值中的引用對(duì)象其實(shí)是指向同一個(gè)東西,無(wú)論修改a還是b铅匹,這個(gè)引用都同時(shí)改變押赊。
例如
import copy
a = [1, 2, 3, ['a', 'b']]
b = copy.copy(a)
# a和b中的['a', 'b']指向同一個(gè)對(duì)象,修改其中一個(gè)都是一樣的
print ("修改a:")
a[3].append('c')
print ("a: %s" % a)
print ("b: %s" %b)
print ("修改b:")
print ("a: %s" % a)
b[3].append('d')
print ("a: %s" % a)
print ("b: %s" %b)
輸出:
>>> import copy
>>> a = [1, 2, 3, ['a', 'b']]
>>> b = copy.copy(a) # 淺拷貝
>>> # a和b中的['a', 'b']指向同一個(gè)對(duì)象包斑,修改其中一個(gè)都是一樣的
>>> print ("修改a:")
修改a:
>>> a[3].append('c')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("修改b:")
修改b:
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> b[3].append('d')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c', 'd']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'c', 'd']]
深拷貝
與淺拷貝不同流礁,深拷貝會(huì)遞歸查找變量的值中更深層的引用涕俗,實(shí)現(xiàn)深層次的拷貝,因此不用擔(dān)心新變量值的改變影響到原變量的值神帅。
例子:
import copy
a = [1, 2, 3, ['a', 'b']]
b = copy.deepcopy(a)
# a和b中的['a', 'b']指向同一個(gè)對(duì)象再姑,修改其中一個(gè)都是一樣的
print ("修改a:")
a[3].append('c')
print ("a: %s" % a)
print ("b: %s" %b)
print ("修改b:")
print ("a: %s" % a)
b[3].append('d')
print ("a: %s" % a)
print ("b: %s" %b)
輸出:
>>> import copy
>>> a = [1, 2, 3, ['a', 'b']]
>>> b = copy.deepcopy(a) # 深拷貝
>>> # a和b中的['a', 'b']指向同一個(gè)對(duì)象,修改其中一個(gè)都是一樣的
>>> print ("修改a:")
修改a:
>>> a[3].append('c')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b']]
>>> print ("修改b:")
修改b:
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> b[3].append('d')
>>> print ("a: %s" % a)
a: [1, 2, 3, ['a', 'b', 'c']]
>>> print ("b: %s" %b)
b: [1, 2, 3, ['a', 'b', 'd']]