04_03、名称空间和作用域

一、名称空间

  一、名称空间的概念

    1、什么是名称空间?

      就是绑定变量名和变量值的地方

    2、名称空间的分类:

      1、内置名称空间

        在python解释器中已经存在的内置方法就可以称之为内置名称空间
        如:len()  print()  open()

      2、全局名称空间

        1、定义

          在py文件中,顶格写的都是全局名称空间

        2、注意

          while true:条件下的第一缩进也属于在全局名称空间(如图)

        3、查看是否在全局名称空间的方法

          globals()把所有在全局名称空间里面的数据,以字典形式输出

 

      3、局部名称空间

        1、定义

          在函数体中存在的都是局部的

        2、查看局部的名称空间的方法

          locals()  把所有在局部名称空间里面的数据,以字典形式输出

 

  二、名字的顺序

    1、按位置查找:

      LEGB 

      看自己位置是在局部还是全局名称空间:
        如果在局部名称空间:局部 >>> 全局 >>> 内置
        如果在全局名称空间: 全局 >>> 内置

    2、局部空间嵌套练习

二、作用域

  一、什么是作用域

    1、定义  

      按照名字作用范围的不同可以将三个名称空间划分为全局作用域和局部作用域:

      全局作用域:

        位于全局名称空间、内建名称空间中的名字属于全局范围,该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效(在任意位置都可以使用);

      局部作用域:

        位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活(即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)

 

     2、名称空间与作用域的关系

      1、名称空间与作用域的关系在函数定义阶段就已经确定,与调用位置无关

    2、名称空间与作用域的关系在函数定义阶段(扫描语法时)就已经确定,与什么时候调用调用位置无关

      此时引出一个问题:python中,因为在定义阶段,函数只会扫描语法错误,而不会报告逻辑错误。

                    所以,如果存在逻辑错误,在函数调用时才会报错。

 

  二、global和nonlocal关键字的使用

    1、global

      1、global关键字的用途

        定义局部名称空间变量为全局名称空间变量,作用域变为全局作用域

        它能使局部变量修改全局变量(如果该变量在全局名称空间有被赋值,则断开指向链接,指向原来的局部名称空间的赋值,并变为全局变量)

      2、注意可变类型与不可变类型

        局部变量修改全局变量时:

          1. 修改的变量是不可变的类型,需要global关键字声明
          2. 修改的变量是可变的类型,不需要global关键字声明

 

    2、nonlocal

      1、nonlocal关键字的用途

        他是内部的局部,修改,外部的局部的变量

        声明位置在局部名称空间内的局部名称空间的变量,修改为局部名称空间内的变量,作用域是内部所在的局部变量

 

      2、注意可变类型与不可变类型

        内部局部变量修改外部局部变量时:

          1. 修改的变量是不可变的类型,需要nonlocal关键字声明
          2. 修改的变量是可变的类型,不需要nonlocal关键字声明

 

posted @   三三得九86  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示