命名空间、作用域、局部作用域修改全局变量、GC机制
- 命名空间
: 变量名称与值的映射关系 - 作用域: 变量作用的区域,即范围
- 注意:class、def、模块会产生作用域;分支语句、循环语句,异常处理语句不会产生新的作用域。
- 作用域的类型区分:
-
![]()
- 练习:定义一个包含四个作用域变量的代码块,并明确说出他们的变量作用域类型
-
-
![]()
- LEGB法则:
-
![]()
- 局部作用域变量的特点:
-
- 局部作用域内修改全局变量:
- 需要在局部作用域内声明全局变量
- 可变类型:
-
- 不可变类型:
-
-
- 当在局部作用域内修改全局变量时,如果全局变量为不可变类型,需要使用global声明变量,才可以修改;
- 如果全局变量为可变类型,可以直接修改。
- global 和 nonlical的区别:
- 在局部修改全局时用:global
- 在局部修改嵌套时用:nonlocal
- nonlocal代码示范:
![]()
- **GC机制:
- 基础概念理解:
- 内存空间的申请与回收是非常耗费精力的事情,且存在极大的危险性,稍有不慎就有可能引发内存溢出问题,
- 好在 Cpython 解释器提供了自动的垃圾回收机制来帮我们解决了这件事。
- Python 的垃圾回收机制 ( 简称GC ) 主要采用的是引用计数为主、标记清除与分代回收为辅的垃圾回收策略
- 引用计数:
- 值被多次引用:不会在内存中重复创建数据,而是引用计数器+1,当对象被销毁时,引用计数器-1,
- 如果引用计数器为0,在内存中进行删除销毁(暂时不考虑其他特殊的情况)。
- 对象被销毁:
-

-
- 注意:引用计数是Cpython解释器提供的垃圾回收机制中的一种方法 基于引用数据器进行垃圾回收机制还有存在一定的问题。
- 分析:执行del操作之后,由于循环引用,所以他们的计数器不会为0,因此,引用计数,失效。
- 标记清除:
-
-
- 为了解决循环引用的问题,我们引入了标记清除,只针对那些可能才在循环引用的对象,进行特殊处理,
- 例如:列表、元组、字典、集合。当这些类型中引入另外一个,并且只有他们互相引用,那么就给标记清除
- 分代回收:
- 对标记清除要进行优化,将那些可能存在循环引用的对象拆分,拆分为3个不同的区域,称为:0/1/2(青年代、中年代、老年代),
- 0:当区域内对象个数阈值达到700时,才执行一个0代的扫描检查。
- 1:当0代(青年代)扫描次数超过10次,则执行一个1代稻苗检查
- 2:当1代(中年代)稻苗次数超过10次后,则执行一次2代的扫价差











浙公网安备 33010602011771号