运行python程序的两种方式
1.交互式
特点:敲一行代码会立即执行,马上就看得到结果
作用:调试程序
2.脚本的方式
把程序写进文件中保存,然后使用命令运行
运行python的三个步骤
1.首先启动python解释器
2.python解释器打开文本编辑器,将内容读取到内存中
3.python解释器开始解析内容,开始识别python内容
变量
1.什么是变量?
量:事物的状态
变:事物的状态是可以被改变的
2.为何要用变量
为了让计算机像人一样记录事物的状态
并且状态是可以改变的
变量存的状态是存放于计算机的内存中的
3.如何用变量
先定义、后引用
变量名在等号左边是赋值操作,只要不在等号右边都是取值操作
ps:变量的三个组成部分
1.变量名(关联一个地址)
2.赋值符号(把房间地址绑定给变量名)
3.变量值(我们记忆的数据)
变量名的命名
首先变量名的命名需要做到见名知意 其次有三个命名规则 1.变量名只能是字母、数字、下划线的组成 2.变量名的第一个字符不能是数字 3.关键字不能为变量名 常见关键字:['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from','global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
变量名的命名风格
一:驼峰体 二:纯小写+下划线(推荐)
变量值具有两大特性
1.id(内存编号 内存地址) 2.type(变量值类型)
ps:id如果相等,值一定相等,id如果不相等,值可能相等
小整数池
python对系统进行的优化,将常用的整数在内存中进行了保存 每次定义时可以不用向系统申请内存空间可以直接调用。 范围-5---256 pycharm小整数池范围要更大些
垃圾回收机制GC
引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值。当一个变量没有用时就应该将其所占的空间释放掉。
直接引用与间接引用
当一个变量值不被直接引用与间接引用时,该变量值即为无用的,即是垃圾。 直接引用:例——x=10 10即为被x直接引用 间接引用:例——y=[x] x=10 10被x直接引用被y间接引用 内存空间的申请与回收非常麻烦,且稍有不慎便会引发内存溢出问题,好在python解释器提供了自动的垃圾回收机制。
PS:内存溢出(Out Of Memory,简称OOM)是指应用 系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。
堆区与栈区
定义变量时,变量名与变量值都需要存储,分别对应内存中两块区域:堆区与栈区 1.定义变量时,变量名与值内存地址的关联关系放在栈区 2.变量值存放于堆区(垃圾回收机制主要回收的地方)
PS:当令x=y时,x与y会指向同一个内存地址
垃圾回收机制GC主要运用的三个方法
1.引用计数:变量值被变量名关联的次数
例:x=10,变量值为10,引用计数+1为1当引用计数为0时删除此变量值 引用计数可能会由于堆区两个变量值循环利用的情况导致引用计数不为0 例子:列表互相存放
2.标记/清除:当应用程序可用的内存空间被耗尽时,停止整个程序,然后进行标记/清除 (1)标记:遍历所有的GC Roots对象(栈区中所有的内容及对象均为GC Root对象)栈区中连接的堆区中的对象均为有用的,将被标记,堆区中没有与栈区中相连的对象均为垃圾,不会被标记 (2)清除,清除没有被标记的堆区中的对象
3.分代回收 由于引用计数的回收机制,每次都会遍历全部对象。十分没有效率因此引入分代回收的概念。 分代回收————在历经多次扫描后一直没有被回收的变量,gc机制(垃圾回收机制)就会认为,该变量是常用变量,减少对其的扫描频率。
实现方法是通过改变变量的权重实现的
假设一个变量的值权重是0每扫描一次其权重加1,当其到一个阈值的时候,系统将会将其移动到更高一级,减少对其的扫描频率。
当然分代回收有一定缺点:一直使用引用计数的方法的话,可以更及时的清除掉垃圾,但是毕竟这种方法缺少效率因此采用分代回收的方法
垃圾回收机制是在清理垃圾&释放内存的大背景下,允许分代回收以极小部分垃圾不会被及时释放为代价,以此换取引用计数整体扫描频率的降低,从而提升其性能,这是一种以空间换时间的解决方案目录