說到python的深淺拷貝,就要先說下python的記憶體分配
當你為變數賦值時,會先開闢一片記憶體,存放該值,將變數指向這個值
當你將x或3值賦予y時,並不會重新開闢新的記憶體,而是直接指向之前值3:
你也可以用函式id()來檢視位址是相等的:
x =
3print
id(x)
# output 7496216
y = x
print
id(y)
# output 7496216
當再次對x賦值為4的時候,會新開闢一片記憶體,存放4,並且把x重新指向4:
位址也變化了不一樣了:
x =
3print
id(x)
# output 56189464
y = x
print
id(y)
# output 56189464
x =4print
id(x)
# output 56189440
深淺拷貝需要引入python的內建模組copyimport copy
import copy
x ="test"
print
id(x)
# output 53921792
t = x
print
id(t)
# output 53921792
y = copy.copy(x)
print
id(y)
# output 53921792
z = copy.deepcopy(x)
print
id(z)
# output 53921792
針對list時,深拷貝z和淺拷貝y會重新開闢了一片記憶體位址,但是賦值的t不會重新分配,而是直接指向x的值
當對x內部的元素(非list,dict元素)進行賦新值或修改時,深淺拷貝的值都不會隨著x變化而變化,只有賦值型別t隨x變化而變化:
print
id(z)9)
x[2]=
4print x
print t
print y
print z
#output
#[2, 3, 4, 8, 9]
#[2, 3, 4, 8, 9]
#[2, 3, 5, 8]
#[2, 3, 5, 8]
當list中存在list時
對list中的list進行修改時,你會發現賦值的t和淺拷貝的y會隨著list a的改變而改變,而深拷貝不受影響,這是因為淺拷貝只對list x本身進行了拷貝,沒有對它內部的list a進行拷貝,只是引用;而深拷貝是對所有物件重新開闢記憶體,所以不受影響
對於list來說,淺拷貝等價於如下的賦值:
import copy
x =[2
,3,5
,8] c = x[:]
#等價於 c = copy.copy(x)
額外list的小技巧;
x =[1
,2,3
,4]# 從後邊加入元素
x[len
(x):]=
[5,6
,7]print
(x)# 從前邊增加元素
x[:0]
=[-1
,0,2
,3]print
(x)# 移除元素
x[1:-
1]=[
]print
(x)#output
#[1, 2, 3, 4, 5, 6, 7]
#[-1, 0, 2, 3, 1, 2, 3, 4, 5, 6, 7]
#[-1, 7]
python 深淺拷貝案例 python 深淺拷貝
深淺拷貝 對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址 import copy a1 22255 a2 22255 print id a1 id a2 3428240 3428240 對於字典 元祖 列表 而言,進行賦值 淺拷貝和深拷貝時,其記憶體位址的變化...
python 深淺拷貝
建立乙個寬度為3,高度為4的陣列 mylist 0 3 4 0,0,0 0,0,0 0,0,0 0,0,0 但是當操作mylist 0 1 1時,發現整個第二列都被賦值,變成 0,1,0 0,1,0 0,1,0 0,1,0 list n n shallow copies of list concat...
python深淺拷貝
python 深淺拷貝 shallow copy 和 deep copy 對於乙個列表,列表裡面可以再放入乙個列表 1 若想複製這乙個列表,使用列表的普通的copy 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....