Python基礎學習13-淺拷貝和深拷貝
淺拷貝
對於某個物件,如何建立它的拷貝呢?也就是說,如何建立與該物件具有相同值的另一個物件呢?
所謂淺拷貝是指,對於某個物件,雖然建立了與該物件具有相同值的另一個物件,但是,這兩個物件內部巢狀的對應的子物件全都是同一個物件。簡單的說,外部進行了拷貝,內部沒有拷貝。
以下方式得到的拷貝都是淺拷貝:
- 切片操作 [:]
- 呼叫列表、字典、結合的方法 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
相關文章
- python 指標拷貝,淺拷貝和深拷貝Python指標
- python基礎學習9—-深淺拷貝Python
- iOS深拷貝和淺拷貝iOS
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- js深拷貝和淺拷貝JS
- Python淺拷貝與深拷貝Python
- python深拷貝與淺拷貝Python
- 淺探js深拷貝和淺拷貝JS
- C++淺拷貝和深拷貝C++
- go slice深拷貝和淺拷貝Go
- JavaScript之深拷貝和淺拷貝JavaScript
- js的深拷貝和淺拷貝JS
- 聊聊物件深拷貝和淺拷貝物件
- ECMAScript-淺拷貝和深拷貝
- js之淺拷貝和深拷貝JS
- 深度解析深拷貝和淺拷貝
- Objective C淺拷貝和深拷貝Object
- java深克隆(深拷貝)和淺克隆(淺拷貝)Java
- vue深拷貝淺拷貝Vue
- IOS學習之淺析深拷貝與淺拷貝iOS
- 【Python】直接賦值,深拷貝和淺拷貝Python賦值
- Python擴充套件_淺拷貝和深拷貝Python套件
- 淺談深拷貝與淺拷貝?深拷貝幾種方法。
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- js實現深拷貝和淺拷貝JS
- JS深拷貝與淺拷貝JS
- javascript 淺拷貝VS深拷貝JavaScript
- js 深拷貝 vs 淺拷貝JS
- ios 深淺拷貝學習iOS
- 對深拷貝和淺拷貝的一些學習心得
- python深拷貝和淺拷貝之簡單分析Python
- 圖解 Python 淺拷貝與深拷貝圖解Python