Python之深淺拷貝

2022-05-19 14:54:49 字數 3541 閱讀 5262

深淺拷貝分為兩部分,一部分是數字和字串另一部分是列表、元組、字典等其他資料型別。

對於數字字串而言,賦值、淺拷貝和深拷貝無意義,因為他們的值永遠都會指向同乙個記憶體位址。

#

匯入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 ...