0. 写作目的
好记性不如烂笔头。
1. python 中的深度拷贝
1.1 常数的拷贝
对于常数的拷贝,类似于数值的地址是一定,当进行赋值时,先共用一个内存,如果一方修改了内容,则该方的地址改变,从而使得两个变量不再相同,即一方修改另一方不会修改。
a = 2
b = a
print( "a = {}, b = {}".format(a, b) )
## result
## a = 2, b = 2
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 1427401776, id(b) = 1427401776
a = 3
print( "a = {}, b = {}".format(a, b) )
## result
## a = 3, b = 2
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 1427401808, id(b) = 1427401776
1.2 list 和 array(numpy)的copy
如果直接赋值拷贝,进行的是浅拷贝。
python2中需要使用b = copy.copy(a)才能赋值,如果是python3则直接使用b = a.copy()即可赋值。
如果使用copy()使用,需要看是数据的类型才能决定是深拷贝还是浅拷贝。
如果是单个list,如a = [1, 2, 3],使用 b = a.copy() 或者 b = copy.copy(a)进行的可以理解为深拷贝,因此改变b中的值,a的值不会改变。但是如果是复杂的list,如a = [ [1, 2], [3, 4] ],如果使用b = a.copy() 或者 b = copy.copy( a )进行的是浅拷贝,如果需要进行深拷贝需要,b = copy.deepcopy( a )。
总结:如果想使用深拷贝,建议直接使用b = copy.deepcopy( a ),以免出现不必要的错误。
import numpy as np
a = [1, 2, 3]
b = a
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 57435528, id(b) = 57435528
b[0] = 10
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 57435528, id(b) = 57435528
b = a.copy()
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 57435528, id(b) = 57435656