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