浅拷贝
对于某个对象,如何创建它的拷贝呢?也就是说,如何创建与该对象具有相同值的另一个对象呢?
所谓浅拷贝是指,对于某个对象,虽然创建了与该对象具有相同值的另一个对象,但是,这两个对象内部嵌套的对应的子对象全都是同一个对象。简单的说,外部进行了拷贝,内部没有拷贝。
以下方式得到的拷贝都是浅拷贝:
- 切片操作 [:]
- 调用列表、字典、结合的方法 copy()
- 调用内置函数 list() 、dict()、set()
- 调用标准库模块 copy 中的函数 copy()
L1 = [[3, 6], 8]
L2 = L1[:]
L2 = L1.copy()
L2 = list(L1)
import copy
L2 = copy.copy(L1) # 调用标准库模块 copy 中的函数 copy
print(L2) # [[3, 6], 8]
print('id(L1):%s' % id(L1)) # id(L1):2484307186696
print('id(L2):%s' % id(L2)) # id(L2):2484596315592
print('id(L1[0]):%s' % id(L1[0])) # id(L1[0]):2326147256840
print('id(L2[0]):%s' % id(L2[0])) # id(L1[0]):2326147256840
print('id(L1[1]):%s' % id(L1[1])) # id(L1[1]):140733955146224
print('id(L2[1]):%s' % id(L2[1])) # id(L2[1]):140733955146224
L1[0][1] = 7
L1[1] = 9
print(L1) # [[3, 7], 9]
print(L2) # [[3, 7], 8]
# 对于没有嵌套子对象的不可变对象,例如:整数对象,字符串对象和元组对象等,不会进行拷贝,也就是说,不会创建另一个对象
i = 18
ic1 = int(18)
print(ic1) # 18
print('id(i):%s' % id(i)) # id(i):140733955146544
print('id(ic1):%s' % id(ic1)) # id(ic1):140733955146544
ic2 = copy.copy(i)
print(ic2) # 18
print('id(i):%s' % id(i)) # id(i):140733947020080
print('id(ic1):%s' % id(ic1)) # id(ic1):140733947020080
t = (1, 2, 3)
tc1 = tuple(t)
print(tc1) # (1, 2, 3)
print('id(t):%s' % id(t)) # id(t):1951394906264
print('id(tc1):%s' % id(tc1)) # id(t):1951394906264
tc2 = copy.copy(t)
print(tc2) # (1, 2, 3)
print('id(t):%s' % id(t)) # id(t):1980822143128
print('id(tc2):%s' % id(tc2)) # id(tc2):1980822143128
深拷贝
所谓深拷贝,指的是:对于某个对象,创建与该对象具有相同值的另一个对象,同时,这两个对象内部嵌套的对应可变子对象,全都不是同一个对象。简单的说,外部和内部都进行了拷贝。
如果不可变对象,内部有嵌套的可变的子对象,在深拷贝后会创建一个与该不可变对象具有相同值的另一个对象
import copy
# 对于没有嵌套子对象的不可变对象,例如:整数对象,字符串对象和元组对象等,不会进行拷贝,也就是说,不会创建另一个对象
i = 18
ic = copy.deepcopy(i)
print(ic) # 18
print('id(i):%s' % id(i)) # id(i):140734429037360
print('id(ic):%s' % id(ic)) # id(ic):140734429037360
t = (1, 2, 3)
tc = copy.deepcopy(t)
print(tc) # (1, 2, 3)
print('id(t):%s' % id(t)) # id(t):1492343996568
print('id(tc):%s' % id(tc)) # id(tc):1492343996568
L1 = [[3, 6], 8]
L2 = copy.deepcopy(L1)
print(L2) # [[3, 6], 8]
print('id(L1):%s' % id(L1)) # id(L1):1744899232776
print('id(L2):%s' % id(L2)) # id(L2):1745186688264
print('id(L1[0]):%s' % id(L1[0])) # id(L1[0]):1744899232264
print('id(L2[0]):%s' % id(L2[0])) # id(L2[0]):1744900612488
print('id(L1[1]):%s' % id(L1[1])) # id(L1[1]):140734429037040
print('id(L2[1]):%s' % id(L2[1])) # id(L2[1]):140734429037040
L1[0][1] = 7
L1[1] = 9
print(L1) # [[3, 7], 9]
print(L2) # [[3, 6], 8]
t1 = ([3, 6], 8)
t2 = copy.deepcopy(t1)
print(t2) # ([3, 6], 8)
print('id(t1):%s' % id(t1)) # id(t1):3119702275208
print('id(t2):%s' % id(t2)) # id(t2):3119702236424
print('id(t1[0]):%s' % id(t1[0])) # id(t1[0]):3119702526728
print('id(t2[0]):%s' % id(t2[0])) # id(t2[0]):3119702415176
print('id(t1[1]):%s' % id(t1[1])) # id(t1[1]):140734429037040
print('id(t2[1]):%s' % id(t2[1])) # id(t2[1]):140734429037040