命名空间、作用域、局部作用域修改全局变量、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代的扫价差

 

      

       


        

posted @ 2020-12-16 09:22  叁年py  阅读(117)  评论(0)    收藏  举报