Python 深淺拷貝

2021-09-09 00:10:48 字數 3508 閱讀 4457

說到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 方法,只能拷貝出列表裡表層的元素,而列表裡的列表卻無法拷貝,只能指向前乙個列表.修改拷貝出的列表裡列表裡的元素,原來的列表會發生改變....