python中的深複製與淺複製
- 2019 年 11 月 20 日
- 筆記
在使用python對數據對預處理,比如歸一化、去噪時,發現處理後的數據會有詭異的 現象,比如全部都是一樣的,或者某些都是一樣的。
調查了一番之後,發現這是由於python中的深淺複製造成的。其實,歸根結底這與python中的記憶體分配與管理方式有關。
下面對不同的複製做出結論。
直接引用
類似於a=[1,2,3] b = a
, 這樣的都是直接引用,b的值會隨著a值的變動而變動
切片複製
切片複製主要是a=[1, 2, 3] b=a[:]
, 當被複制的對象內部只是基本類型而沒有嵌套類型時,切片複製可以實現兩個對象的隔離。
注意,嵌套類型指的是列表中還有列表,字典中嵌套列表等等複雜類型。
淺複製
指的是b = copy.copy(a)
的情況,對簡單類型有用
深複製
指的是b = copy.deepcopy(a)
的情況,就是你所想像的兩個對象互不影響的複製。
完整測試
#encoding:utf-8 import numpy as np import copy a = [1, 2 , 3, [4, 5]] reference_a = a slice_copy_a = a[:] shallow_copy_a = copy.copy(a) deep_copy_a = copy.deepcopy(a) # print original print('Original a istt ', a) # 修改a的基本元素 a[0] = 100 # 修改a的複雜元素 a[3][0] = 1000 print('Now a is tt', a) print('reference_a istt', reference_a) print('shallow copy istt ', shallow_copy_a) print('slice copy is tt', slice_copy_a) print('deep copy is tt', deep_copy_a)
Reference: