关于numpy的浅拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
示例:
import numpy as np a=np.array([1,2,3]) b=[] for i in range(0,2): a+=1 b.append(a) print(b)
运行结果为:
[array([3, 4, 5]), array([3, 4, 5])]
使用copy方法以获得深拷贝。
import numpy as np a=np.array([1,2,3]) b=[] for i in range(0,2): a+=1 b.append(a.copy()) print(b)
运行结果为:
[array([2, 3, 4]), array([3, 4, 5])]
另外,转为list也可以避免浅拷贝。
import numpy as np a=np.array([1,2,3]) b=[] for i in range(0,2): a+=1 b.append(a.tolist()) print(b)
运行结果为:
[[2, 3, 4], [3, 4, 5]]
补充
有一个和上述问题类似的现象,当我想创建一个双层列表时,我一开始是这样做的,但是并不正确,因为列表中的所有元素都是同时变化的。
lists = [[]]*3 lists[0].append('1') print(lists)
它的输出是:[['1'], ['1'], ['1']]
用下面这种方法才可以创建相互独立的元素。
lists = [[] for _ in range(0,3)] lists[0].append('1') print(lists)
运行结果为[['1'], [], []]