1. 程式人生 > >python的深淺拷貝,以及實現方法和應用場景+其他拷貝(¥71)

python的深淺拷貝,以及實現方法和應用場景+其他拷貝(¥71)

deepcopy 應用 內置 模塊 ngs 分片 賦值 增加 指向

深淺拷貝的定義:

淺拷貝只是增加了一個指針指向一個存在的地址,

深拷貝是增加一個指針並且開辟了新的內存,這個增加的指針指向這個新的內存,
采用淺拷貝的情況,釋放內存,會釋放同一內存,深拷貝就不會出現釋放同一內存的錯誤

一層的情況:

import copy
 
# 淺拷貝
li1 = [1, 2, 3]
li2 = li1.copy()
li1.append(4)
print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]
 
# 深拷貝
li1 = [1, 2, 3]
li2 = copy.deepcopy(li1)
li1.append(4)
print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]

多層的情況:

import copy
 
# 淺拷貝 指向共有的地址
li1 = [1, 2, 3,[4,5],6]
li2 = li1.copy()
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]
 
# 深拷貝 重指向
li1 = [1, 2, 3,[4,5],6]
li2 = copy.deepcopy(li1)
li1[3].append(7)
print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]

其他

3. 拷貝的其他方式

淺拷貝對不可變類型和可變類型的copy不同

In [88]: a = [11,22,33]

In [89]: b = copy.copy(a)

In [90]: id(a)

Out[90]: 59275144

In [91]: id(b)

Out[91]: 59525600

In [92]: a.append(44)

In [93]: a

Out[93]: [11, 22, 33, 44]

In [94]: b

Out[94]: [11, 22, 33]

In [95]:

In [95]:

In [95]: a = (11,22,33)

In [96]: b = copy.copy(a)

In [97]: id(a)

Out[97]: 58890680

In [98]: id(b)

Out[98]: 58890680

分片表達式可以賦值一個序列

a = "abc"

b = a[:]

字典的copy方法可以拷貝一個字典

d = dict(name="zhangsan", age=27)

co = d.copy()

有些內置函數可以生成拷貝(list)

a = list(range(10))

b = list(a)

copy模塊中的copy函數

import copy

a = (1,2,3)

b = copy.copy(a)

python的深淺拷貝,以及實現方法和應用場景+其他拷貝(¥71)