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:

  1. http://python.jobbole.com/82294/