python机制详解
浅拷贝:藕断丝连
深拷贝:原对象和新对象没有任何关系
1.python中对象的赋值实际上是对象的引用。
不可变对象:字符串、整形、元组。当你试图更改不可变对象的时候,例如执行了a = 1 实际是创建了一个新的值为1的对象让a指向它。
可变对象:列表、字典、集合。如列表list中适用append后list指向不变只是增加了内容。但是如果执行了l2= list,list = list+[1],则创建了一个结尾加上1的新列表。l2中仍然保留了以前旧的list的值。
2.变量能够删除,但是对象无法删除。如del name,删除了name这个变量,但是name中的内容[1,2,3]没有被删除,当该内容没有被引用后python的内存回收机制会将它回收。
3.当函数中的参数传入的是可变对象的时候,在函数中修改该对象将真实的影响到该对象的值(和C++的形参不同)。
介绍完这几个python的特性,接下来我们来讲堆区和栈区,最后再讲深拷贝和浅拷贝。
内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。
代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。
静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。
栈区:存储运行方法的形参、局部变量、返回值。对象的引用。
堆区:new对象的对象存在这。
寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。
ram 主存:与cpu直接交换数据,速度快。断电后数据丢失。RAM用来暂时存储程序、数据和中间结果。
rom只读存储器:断电了数据仍然能够保留。
好了,接下来讲到深拷贝和浅拷贝:
浅拷贝:是对一个对象父级的拷贝,不拷贝内部。外层数据可变,浅拷贝会开辟新的内存空间存放。外层数据不可变,浅拷贝仍然是引用。白话:拷贝你的引用,地址相同。
深拷贝:内外都拷贝。可以减少内存的使用,防止修改数据后找不到原来数据。原理是递归拷贝一个类中每个对象和它的子对象。
GIL机制:在 CPython 解释器中执行的每一个 Python 线程,都会先锁住自己,以阻止别的线程执行。
某个线程要使用解释器,就会把门关上,而门上的锁就是GIL,不能和别人分享。由于不能让一个线程享受解释器,所以是大家轮流来依次享用。
为什么会还没用爽就让给别人用呢?
间隔式检查(check_interval),每隔一段时间CPython 解释器会去强制把门打开让这个使用时间过长的线程滚,给别的线程爽爽。
解释器:把高级语言转义给处理器运行。
线程和进程
进程:好比一段程序的执行过程,是操作系统执行的基本单元。程序的有代码所以进程有文本区域来存代码,也得有数据所以有数据区域,还有堆栈(栈区存变量,堆区存对象)。
线程:cpu调度的基本单元,独立运行的基本单位,调度开销少。
区别:一个程序至少有一个进程,一个进程至少有一个线程。线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP(多核处理机)机器上运行,而进程则可以跨机器迁移。

浙公网安备 33010602011771号