命名空间、作用域、LEGB法则、垃圾回收机制
一、命名空间、作用域、LEGB法则、
1.命名空间和作用域 :
命名空间:变量名称与值的映射关系
作用域:变量作用的区域,即范围。
注意:class/def/模块会产生作用域;分支语句,循环语句,异常处理语句不会产生新的作用域。
2.作用域的类型区分:
命名空间:变量名称与值的映射关系
作用域:变量作用的区域,范围。
作用域分类型:
局部作用域:Local 简称 L
嵌套作用域:Enclosing 简称 E
全局作用域: Global 简称 G
内置作用域:Builtin 简称 B
3、LEGB法则:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域
4.局部作用域变量的特点:
局部变量只能在局部访问
函数运行,开辟栈帧,在函数栈帧存活期间,访问局部变量,可以访问得到,如果函数栈帧销毁,则所有数据对象销毁。
5.局部作用域内修改全局变量:
需要在局部作用域内生成全局变量
当在局部作用域内修改全局变量时,如果全局变量为不可变类型,需要使用global
生命全局变量,才可以修改;如果全局变量为可变类型,可以直接修改。
6.总结:
命名空间与作用域
作用域类型:LEGB
LEGB法则
局部作用域内修改全局变量
可变类型:直接修改
不可变量:global
在局部修改全局的:global
在局部修改嵌套的:nonlocal
二、垃圾回收机制
1.基础概念理解:
内存空间的申请与回收是非常耗费精力的事情,且存在极大的危险性,稍有不慎就有可能引发内存溢出问题,好在 Cpython 解释器提供了自动的垃圾回收机制来帮我们解决了这件事。 Python 的垃圾回收机制 ( 简称GC ) 主要采用的是引用计数为主、标记清除与分代回收为辅的垃圾回收策略
2.引用计数:
值被多次引用:不会在内存中重复创建数据,而是引用计数器+1,当对象被销毁时,引用计数器-1,如果引用计数器为0,在内存中进行删除销毁(暂时不考虑其他特殊的情况)。
例:
3.标记清除:
为了解决循环引用的问题,我们引入了标记清除,只针对那些可能才在循环引用的对象,进行特殊处理,例如:列表、元组、字典、集合。
当
这些类型中引入另外一个,并且只有他们互相引用,那么就给标记清除。
4.分代回收:
对标记清除要进行优化,将那些可能存在循环引用的对象拆分,拆分为3个不同的区域,称为:0/1/2(青年代、中年代、老年代),
0:当区域内对象个数阈值达到700时,才执行一个0代的扫描检查。
1:当0代(青年代)扫描次数超过10次,则执行一个1代扫描检查。
2:当1代(中年代)稻苗次数超过10次后,则执行一次2代的扫价差。
5.总结:
垃圾回收机制(GC机制)
以引用计数为主,标记清除和分代回收为辅
最新文章
- 记lrd的高二上学期第五次调研考试
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理8
- JS 判断当前使用浏览器名及版本
- Socket通信(转)
- 深入理解CRITICAL_SECTION
- L0、L1与L2范数、核范数(转)
- php 删除文件夹及文件
- MVC-ActionResult解说
- 探究ListView 的缓存机制
- DB2 VC++ 中连接字符串
- 实现简单的手写涂鸦板(demo源码)
- dubbo源码—dubbo简介
- Ueditor1.3.6 setContent的一个bug
- Spring Boot学习总结四
- C#基础第五天
- vim YouCompleteMe 遇到的问题及解决
- weapp-mobx
- 薛兆丰吴军何帆曾鸣万维刚李笑来罗永浩等得到APP专栏作者的书23本
- 图片路径中含有中文在jsp下不能正常显示的问题
- Lua基本语法-lua与C#的交互(相当简单详细的例子)