1. 程式人生 > 程式設計 >python深copy和淺copy區別對比解析

python深copy和淺copy區別對比解析

這篇文章主要介紹了python深copy和淺copy區別對比解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

首先先看一段程式碼

import copy
 
a = [1,2,3,[4]]
b = a
c = a.copy()
d = copy.deepcopy(a)
e = copy.copy(a)
a.append(4)
a[3].append(5)
print('a值為 {} 地址為 {}'.format(a,id(a)))
print('b值為 {} 地址為 {}'.format(b,id(b)))
print('c值為 {}  地址為 {}'.format(c,id(c)))
print('d值為 {}    地址為 {}'.format(d,id(d)))
print('e值為 {}  地址為 {}'.format(e,id(e)))

執行結果:

a值為 [1,[4,5],4] 地址為 4555940360
b值為 [1,4] 地址為 4555940360
c值為 [1,5]]  地址為 4555873544
d值為 [1,[4]]    地址為 4556227912
e值為 [1,5]]  地址為 4556227464

從結果中可以看出來:

b賦值的為a的記憶體地址,值會隨著a的變化而變化---直接賦值,物件引用

c=a.copy()使用的為python自帶的copy方法,從結果中可看出複製後c的地址與a的地址不一致,也就是c將a的值完全複製包括地址,其結果就是c的值不會隨著a的值變化而變化---深copy,完全拷貝了父物件及其子物件

d和e使用的是python自帶的copy模組中的copy方法和deepcopy方法:

  其中d的值地址和a不一致,值也不會隨著a的變化而變化---深copy,完全拷貝了父物件及其子物件

其中e中父級內容不隨著a的變化而變化,但e中子list中內容會隨著a的變化而變化---淺copy,拷貝父物件,不會拷貝物件的內部的子物件

print('a子物件值為 {} 地址為 {}'.format(a[3],id(a[3])))
print('e子物件值為 {} 地址為 {}'.format(a[3],id(a[3])))
結果:
a子物件值為 [4,5] 地址為 4334486344
e子物件值為 [4,5] 地址為 4334486344

由上可得出,python中的copy分為三種:

1、直接複製:也就是物件引用

2、淺拷貝:拷貝父物件,不會拷貝物件的內部的子物件。

3、深拷貝:完全拷貝了父物件及其子物件

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。