淺拷貝和深拷貝
深入瞭解參數傳遞的底層原理,需要理解一下“淺拷貝和深拷貝”,拷貝的內置函數爲:copy(淺拷貝)、deepcopy(深拷貝)
淺拷貝:不拷貝子對象的內容,只是拷貝子對象的引用。
深拷貝:會連子對象的內存也全部拷貝一份,對子對象的修改不會影響源對象
例子:
import copy
def testcopy():
'''測試淺拷貝'''
a=[11,22,[33,44]]
b=copy.copy(a)
print("a",a)
print("b",b)
b.append(55)
b[2].append(66)
print('淺拷貝')
print('a',a)
print('b',b)
testcopy()
返回:
>>>a [11, 22, [33, 44]]
b [11, 22, [33, 44]]
淺拷貝
a [11, 22, [33, 44, 66]]
b [11, 22, [33, 44, 66], 55]
注:可以從結果看到,淺拷貝b修改子元素時,源對象也跟着修改了。根據圖可以看到,淺拷貝只拷貝第一層引用地址,之後引用還是使用原引用地址沒有發生改變。如圖:
深拷貝示例:
def testdeepcopy():
'''測試深拷貝'''
a = [11, 22, [33, 44]]
b = copy.deepcopy(a)
print("a", a)
print("b", b)
b.append(55)
b[2].append(66)
print('深拷貝')
print('a', a)
print('b', b)
testdeepcopy()
返回值:
>>>a [11, 22, [33, 44]]
b [11, 22, [33, 44]]
深拷貝
a [11, 22, [33, 44]]
b [11, 22, [33, 44, 66], 55]
注:根據所示可以看出,深拷貝是把有關對象指向全部拷貝一份。深拷貝b修改數據時,將不會修改a任何數據