深淺拷貝分為兩部分,一部分是數字和字串另一部分是列表、元組、字典等其他資料型別。
對於數字
和字串
而言,賦值、淺拷貝和深拷貝無意義,因為他們的值永遠都會指向同乙個記憶體位址。
#匯入copy模組
>>> import
copy
#定義乙個變數var1
>>> var1 = 123
#輸出var1的記憶體位址
>>>id(var1)
1347747440
>>> var2 =var1
#var2的記憶體位址和var1相同
>>>id(var2)
1347747440
#淺拷貝
>>> var3 =copy.copy(var1)
#var3的記憶體位址和var1相同
>>>id(var3)
1347747440
#深拷貝
>>> var4 =copy.deepcopy(var1)
#var4的記憶體位址和var1相同
>>> id(var4)
1347747440
對於字典、元祖、列表 而言,進行賦值、淺拷貝和深拷貝時,其記憶體位址的變化是不同的。
var1 =賦值
>>> var1 =如圖所示:>>> var2 =var1
>>>id(var1)
1937003361288
>>>id(var2)
1937003361288
淺拷貝淺拷貝,在記憶體中只額外建立第一層資料
#如圖所示:匯入拷貝模組
>>> import
copy
>>> var1 =
#使用淺拷貝的方式
>>> var2 =copy.copy(var1)
#兩個變數的記憶體位址是不一樣的
>>>id(var1)
2084726354952
>>>id(var2)
2084730248008
#但是他們的元素記憶體位址是一樣的
>>> id(var1["k1"
])2084726207464
>>> id(var2["k1"
])2084726207464
深拷貝深拷貝,在記憶體中將所有的資料重新建立乙份(排除最後一層,即:python內部對字串和數字的優化)
#如圖所示:匯入拷貝模組
>>> import
copy
>>> var1 =
#使用深拷貝的方式把var1的內容拷貝給var2
>>> var2 =copy.deepcopy(var1)
#var1和var2的記憶體位址是不相同的
>>>id(var1)
1706383946760
>>>id(var2)
1706389852744
#var1和var2的元素"k3"記憶體位址是不相同的
>>> id(var1["k3"
])1706389853576
>>> id(var2["k3"
])1706389740744
#var1和var2的"k3"元素的記憶體位址是相同的
>>> id(var1["
k3"][1])
1706383265744
>>> id(var2["
k3"][1])
1706383265744
# 對數字 字串
# a = 1
# b =a
## print(id(a) ==id(b))
# b = 12
# print(a, b)
# print(id(a) ==id(b))
# a = 'aa'
# b =copy.copy(a)
# print(a, b)
# print(id(a) ==id(b))
## b = 'bb'
# print(a, b)
# print(id(a) ==id(b))
# c =copy.deepcopy(a)
# print(a, c)
# print(id(a) ==id(c))
## c = 'cc'
# print(a, c)
# print(id(a) ==id(c))\
# a = [1, 2, 3, 4, 5]#
# b =a
## b[
1] = 5
# print(a, b)
# print(id(a) ==id(b))
## a = [1, 2, 3, 4, 5, [1, 2
]]# b =copy.copy(a)
# print(a, b)
# print(id(a) ==id(b))
# print(id(a[
1]) == id(b[1
]))# print(id(a[
5]) == id(b[5
]))# b[
1] = 10
# print(a[1])
# print(id(a[
1]) == id(b[1
]) )
## print(
'----------')
# print(id(a[
5][0]) == id(b[5][0
]))# b[
5][0] = 50
# print(a[
5][0
])# print(id(a[
5][0]) == id(b[5][0
]))a = [1, 2, 3, 4, 5, [5, [[1,2],8]], ]
b =copy.deepcopy(a)
print(id(a) ==id(b))
print(id(a[
3]) == id(b[3
]))print(id(a[
5]) == id(b[5
]))# b[
3] = 20
# print(a, b )
print(id(a[
5][1][0][1]) == id(b[5][1][0][1
]))b[
5][1][0] = 20
print(a[
5][1][0])
python之深淺拷貝
lis 1 3,world 1,hello lis 2 lis 1.copy print 列表1元素的id lis 1,id lis 1 0 id lis 1 0 0 id lis 1 0 1 id lis 1 1 id lis 1 2 print 列表2元素的id lis 2,id lis 2 0...
python之深淺拷貝
基礎沒打牢,python的深淺copy老是混淆,模稜兩可的。一 物件賦值 a 1,2,3 b a 物件賦值 print id a print id b 執行上面的 可以發現id a id b 為什麼呢?其實是在記憶體中有乙個列表 1,2,3 a和b就是兩個標籤,都指向列表 1,2,3 如下圖 當修改...
python之深淺拷貝
對於 數字 和 字串 而言,賦值 淺拷貝和深拷貝無意義,因為其永遠指向同乙個記憶體位址。importcopy 數字 字串 n1 123 n1 age 10 print id n1 賦值 n2 n1 print id n2 淺拷貝 n2 copy.copy n1 print id n2 深拷貝 n3 ...