zoukankan      html  css  js  c++  java
  • 17.3.20---python的变量作用域

    1---变量的作用域

      在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。Python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定

    2---高级语言对数据类型的使用过程

      一般的高级语言在使用变量时,都会有下面4个过程。当然在不同的语言中也会有着区别。
      1. 声明变量:让编辑器知道有这一个变量的存在
      2. 定义变量:为不同数据类型的变量分配内存空间
      3. 初始化:赋值,填充分配好的内存空间
      4. 引用:通过引用对象(变量名)来调用内存对象(内存数据)

    3---作用域的产生

      就作用域而言,Python与C有着很大的区别,在Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念

          注意:在if-elif-else、for-else、while、try-except ry-finally等关键字的语句块中并不会产成作用域

    4---作用域的类型

        1)局部作用域L(local)

            包含在def关键字定义的语句块中,即在函数中定义的变量

            每当函数被调用时都会创建一个新的局部作用域。

            Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间

            在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量

            有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 ,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间

         2)E(enclosing)嵌套作用域

            E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

         3)G(global)全局作用域

            即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
    注意:全局作用域的作用范围仅限于单个模块文件内 

         4)B(built-in)内置作用域

            系统内固定模块里定义的变量,如预定义在__builtin__ 模块内的变量。

         5)变量名解析LEGB法则

            搜索变量名的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域 

     1 #!/usr/bin/env python
     2 #conding:utf8
     3 
     4 globalVar = 100           #G
     5 
     6 def test_scope():
     7     enclosingVar = 200    #E
     8     def func():
     9         localVar = 300    #L
    10 print __name__            #B

    5---变量的修改

    1)nonlocal关键字

        在L中修改E中的变量。这是Python3.x增加的新特性,在python2.x中还是无法使用。

    6---详情还可见:

    http://lib.csdn.net/article/python/60712#%E7%9B%AE%E5%BD%95

  • 相关阅读:
    tpot从elastic search拉攻击数据之三 用于拉取的java程序
    tpot从elastic search拉攻击数据之二 配置端口映射
    wireshark使用
    VS c++ opencv画图
    java maven项目打包
    从es中拉取全部数据/大量数据 使用scroll+scan避免深分页
    java配置文件properties,yml,一般文件
    解决:JQuery "Uncaught ReferenceError: $ is not defined"错误
    java 字符串解析为json 使用org.json包的JSONObject+JSONArray
    easyui最简单的左右布局实现,及tab的右键菜单实现
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/6586710.html
Copyright © 2011-2022 走看看