python的深淺拷貝,以及實現方法和應用場景+其他拷貝(¥71)
阿新 • • 發佈:2019-04-19
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)