个人的一点思考,觉得不对的欢迎在下方评论。
关于Numpy的copy,网上一堆博客都提出了no copy、shallow copy、deep copy,个人认为,这种分类是不太合理的,有误导性的。
ls = [[1, 2], [2, 3, 4]]
np1 = np.array(ls, dtype=list)
np2 = np1.copy()
np1[1][0] = 100
print(np2)
正如上面这段代码,使用了.copy(),即所谓的深拷贝,但事实上,np1和np2并不是完全独立的,恰恰是python变量拷贝中的浅拷贝情况,只拷贝了最外层容器,副本中的元素是源容器中元素的引用。
而要实现真正的deepcopy,使用 np2 = copy.deepcopy(np1.copy())
个人的一点思考,觉得不对的欢迎在下方评论。关于Numpy的copy,网上一堆博客都提出了no copy、shallow copy、deep copy,个人认为,这种分类是不太合理的,有误导性的。ls = [[1, 2], [2, 3, 4]]np1 = np.array(ls, dtype=list)np2 = np1.copy()np1[1][0] = 100print(np2)# [list([1, 2]) list([100, 3, 4])]正如上面这段代码,使用了.copy(
变量:python中的变量简而言之就是指针,变量总是存放对象的引用(或者说是对象的地址,id);
因此每个变量所需要的存储空间大小一致,与所指向的对象类型无关,因为每个变量都只是保存了指向对象的内存地址。
变量都没有类型(都是对象的引用),这意味着变量可以指向任何对象。
变量是分配在栈上,用来指向某一个对象。
变量分为可变变量和不可变变量;
对象:对象就是分配的一块...
深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误。
所谓拷贝,就是赋值。把一个变量赋给另外一个变量,就是把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份。
1.深拷贝--np.copy()
通过”深拷贝“得到的变量互不干扰,其中一个变量的值改变时,不影响其他变量的值。
深拷贝的特点:
变量的内存地
python中若想将a的值赋给b,又不想关联起来.copy()浅拷贝;copy.deepcopy()深拷贝
直接赋值是浅拷贝,是直接将新的变量指向同一内存地址,但是copy会进行一个较深度的复制,会开辟一个新的内存空间,将原有数据赋值进去,再将新的变量指向新的内存地址
b = a[:], b=a.copy()效果相同,但是都是浅拷贝;如果矩阵中存在可变变量引用,还是会变动的
观察是否关联 看看 地址 就可以了 print(id(A) == id(B))即
Numpy深拷贝、浅
拷贝、视图笔记浅
拷贝一级目录一级目录
拷贝就是一个变量的值传给另外一个变量。在
python 中 id()方法可以查看存放变量的内存地址,这为我们理解深浅
拷贝提供了便利。
import
numpy as np
a = np.array([-45,-66,2,25,99,-33])
b = a
b is a
在Python中,当你使用赋值运算符(=)来复制一个数组或列表时,实际上只是创建了一个指向原始数据的新引用。这被称为浅拷贝。这意味着,如果你更改了新对象中的元素,原始对象中的相应元素也会随之更改。
为了避免这种情况,可以使用深度复制(deep copy)。深度复制会创建一个新的对象,其中包含原始对象中所包含的所有内容的副本。这样,任何对新对象的更改都不会影响原始对象。
在NumPy中,可以使用copy()方法进行深拷贝,也可以使用view()方法进行浅拷贝。例如,假设我们有一个NumPy数组a:
```python
import numpy as np
a = np.array([1, 2, 3])
要进行深拷贝,可以使用copy()方法:
```python
b = a.copy()
要进行浅拷贝,可以使用view()方法:
```python
c = a.view()