day16-内存管理和拷贝
一、多继承
1. 多继承
- python中的类支持多继承
- class 子类(父类1,父类2,...)
- 多继承只能继承第一个父类的对象属性
二、运算符重载
1. 运算符
- python中所有的数据类型本质都是类,所有的数据本质都是对象
- 在使用运算符对数据进行操作的时候,实质是在调用运算符对应的魔法方法,运算符前面的数据类型,决定了函数调用哪个类中对应的魔法方法
- 每个运算符都有自己固定的魔法方法,看某种类型的数据是否支持某种运算符就看这个类型中有没有实现对应的魔法方法
- 注意:>和<符号只需要重载一个,另外一个自动支持
三、内存管理
手动内存管理
- 内存分为栈区间和堆区间,栈区间中的内存是自动开辟自动释放的;堆里的内存需要程序员写代码申请和释放
1. 内存的开辟
- python中所有的类型都是类,所以所有的数据都是对象。对象都是保存在堆区间;变量是保存在栈区间,变量中实际保存的堆中存储的数据的地址。(变量的本质就是指针)
- 注意:除了数字和字符串对象,其他数据都是每次需要的时候直接在堆中开辟区间。数字和字符串会先检查这个数据之前是否保存过,如果保存过就直接用之前的数据,否则才开辟新的空间。
2. 内存的释放
- python中内存的释放采用的是'垃圾回收机制'自动释放
- 垃圾回收机制原理:
- 1)看一个数据是否需要销毁(回收),就看这个对象的引用计数是否为0(引用:保存对象地址的数据)
- 2)如果这个对象引用计数不为0就假设当前对象消失,然后看会不会有其他对象因为它的消失引用计数变为0,如果有,就将另外一个对象也回收(循环引用释放)
- 注意:用一个变量给另外一个变量赋值实质上赋的是地址
- ==和is的区别:==(判断的是值是否相等);is(判读的是地址是否相等)
四、浅拷贝和深拷贝
1. 使用变量的3种情况
- 1)直接赋值:赋的是地址,赋完值后两个变量一模一样
- 2)浅拷贝:列表[:]、列表.copy()、copy.copy()
- 直接复制被拷贝的数据,产生一个新的地址,将新的地址赋值给变量;
- 如果被拷贝的对象有子对象,子对象不会被赋值
- 3)深拷贝:
copy.deepcopy()
- 直接复制被拷贝的数据,产生一个新的地址,将新的地址赋值给变量;
- 如果被拷贝的对象有子对象,子对象也会被赋值