关于numpy及list的深拷贝理解

建议先看:https://blog.****.net/xidianliutingting/article/details/51682867
讲的很好。我会在上面进行补充。
以前一直知道有这个概念,但是由于一直没有遇到便没有在意,当在写momentum优化梯度代码时,又一次遇到了,所以决定梳理一下。
都知道copy是深拷贝,那么它到底能干吗?什么时候会用到?
来看:

a = []
x = np.array([1])
for i in range(10):
    a.append(x)
    x+=1
a

你能正确说出a是什么样子的嘛?由于一开始append的是1,然后再加1,就是append的2.以此类推。那么a应该是递增的numpy数。然而:
关于numpy及list的深拷贝理解
它是这样的。为什么呢?因为虽然x不断自加1,而且列表不断添加新元素,但是添加的一直是x的视图,意思是其实x就一个地址,一直没变。你一直添加x,而x就一个地址啊,所以都是一样的。
这时就需要x.copy()了,深复制,你x再自加,和我的备份copy没有关系。他们不会互相影响,也就不是一个地址了。如下
关于numpy及list的深拷贝理解
当然,列表也类似。但又不同,建议看文章开头的链接。
这是开头链接的截图:
关于numpy及list的深拷贝理解
同时补充下,list也有.copy()的属性,和切片类似也是深拷贝。
关于numpy及list的深拷贝理解
关于numpy及list的深拷贝理解
最后补充下,你平常见到的可能是这样的:

a = []
x = 1
for i in range(10):
    a.append(x)
    x+=1
a

整数自加,再不断添加到列表a里,这时输出你不用担心:
关于numpy及list的深拷贝理解
只是因为np数组和列表都是特殊的数据结构,所以才会比较不同。