python原生拷贝
无拷贝:直接赋值
>>> import copy
>>> a = [1, 2, 3]
>>> b = a
>>> id(a)
2207106563520
>>> id(b)
2207106563520
>>> id(a[0])
140714276431760
>>> id(b[0])
140714276431760
浅拷贝:数据存储地址不变,仅改变存储指向这块区域的地址的存放地址(即对象不变)
>>> b = copy.copy(a)
>>> id(a)
2207106563520
>>> id(b)
2207106666432
>>> id(a[0])
140714276431760
>>> id(b[0])
140714276431760
深拷贝:数据存储地址和存储指向这块区域的地址的存放地址都会改变(即对象变了)
方法为copy.deepcopy()。示例略。
numpy包的拷贝
直接赋值等同于浅拷贝(注意:不是使用copy包的copy方法)(对象没变,存储对象的位置也没变)
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> id(a)
2207106441936
>>> b = a
>>> id(b)
2207106441936
>>> id(a[0])
2207106338160
>>> id(b[0])
2207106338160
值得注意的是,当使用切片拷贝时:数据保存地址未发生改变,变得同样是存储地址的地址
>>> b = a[1:2]
>>> id(a)
2207106441936
>>> id(b)
2207106441840
>>> id(b[0])
2207106338096
>>> id(a[1])
2207106338096
深拷贝:numpy的copy方法执行深拷贝(对象没变,只是存储对象的位置变了)
>>> b = a.copy()
>>> id(a)
2207115500496
>>> id(b)
2207106442032
>>> id(a[0])
2207106338224
>>> id(b[0])
2207106338224
此时,数据存储地址没有发生改变,改变的只是存储地址的地址。