Python中关于内存空间的理解
我们先看看
基本类型变量在内存中的存储方式
// C语言
int a,b;
a = 1;
b = a;
a = 99;
printf("b is %d",b);
// python
a = 1;
b = a;
a = 99;
print("b is {b}");
下图是整个过程
我们再来说说
深拷贝和浅拷贝的理解
先要了解python中变量的基本类型
number string boolen tuple list dict set,
将其分为可变和不可变类型
- 可变 => 变量在内存中存储后不可以再改变,即id地址上的数据无法更改,只能是重新赋值。
- 不可变 => 反之。
可变类型有: list dict set
不可变类型有: string number tuple
举例说明
对象a =[1,2,3,4,’b’]
对象c =copy.copy(a)
下图是对象在内存中的模型
深浅的初步了解?️
浅拷贝:对父对象的拷贝 即把a对象拷贝另外一个地址空间,但是里>面的资源地址空间没有变。
深拷贝:对对象的资源的拷贝。
深浅拷贝的深度理解?️
理解一
浅拷贝
1、对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
2、对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
3、浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。
深拷贝
1、浅拷贝,除了顶层拷贝,还对子元素也进行了拷贝(本质上递归浅拷贝)作拷贝对象对原始对象的也是同理)
2.经过深拷贝后,原始对象和拷贝对象所有的元素地址都没有相同的了
理解二
浅拷贝顾名思义就是拷贝的比较浅我们可以把赋值认为是新建了一个对象的引用,把原来被对象内存空间的数据指向新的变量,这时同一块内存空间指向两个变量。浅拷贝与赋值不同,既然是拷贝,那么就是要开辟一块新的内存空间,复制的是原来被拷贝对象内多个元素对象的引用,有几个元素对象就赋值几个元素对象的引用。因此,被浅拷贝对象内的元素改变,会引起浅拷贝对象内元素的改变;被拷贝对象添加元素,拷贝对象不再添加元素(因为没有一个新的引用);被拷贝对象删除元素,拷贝对象也删除元素(元素都已经删了,虽然引用存在,但是并没有什么卵用)。
深拷贝其实与浅拷贝有本质的区别
深拷贝不会复制任何的引用,对象内的所有元素,子元素,孙子元素,重孙元素,曾孙元素的数据都是由复制而来。它的实现原理就是递归,只要任意元素内仍然有子元素,就会复制子元素的数据放到新的内存地址。既然这样,在使用深拷贝后,被拷贝对象的改变,不会引起拷贝对象的任何改变。