• python变量的命名空间


    首先必须要提一下python程序执行过程中变量的查找规则

    较官方的查找机制是:

    局部作用域--外部函数作用域--全局作用域--内建函数作用域

    其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是一个封装好的实例函数,

    它的内部变量一般在函数外部无法获取到

    什么是局部作用域,外部函数作用域和全局作用域?

    1. 局部作用域

    指的是函数内部的作用域

    例如:

    def  fn(a,b,c):

        d=1

        process

    函数内的变量d位处的作用域就是函数的内部作用域,另外给fn()传入的参数a,b,c也位于函数内部的作用域内,

    函数一旦调用完毕就会在内存中销毁

    2. 外部函数函数作用域

    例如:

    def  fn1():

       e=1

       def  fn2():

         pass

    变量e所在的区域,外有fn1包裹,下有fn2函数,变量e所在的作用域就为外部函数作用域,外部函数作用域可以有

    多个,这取决于函数有多少层嵌套

    3. 全局作用域

    例如:

    f=1

    def  fn1():

       e=1

       def  fn2():

         pass

    (此例在2.中例子基础上增加了变量f)

    可见,变量f所在的作用域就是全局作用域,就是没有被函数包裹(即在所有函数之外)的作用域

    为什么要区分局部变量和全局变量:

    1. 避免变量名的冲突,因为python是一种类型较弱的语言,变量可以随时被赋值和修改为各种类型的数据,

    这样容易引起命名上的冲突,局部变量和全局变量的区分使得这种冲突得到缓解

    2. 为了提高效率,减少内存的占有,python规定局部变量在函数调用完之后就删除,而全局变量则不会删除

    在谈及变量的命名空间这个话题必须要知道的两个语句:

    global语句和nonlocal语句

    global语句

    一般条件下,全局作用域内定义的变量在局部变量内是无法修改的,而global语句则例外,

    它在函数内部声明一个变量是全局内的变量,需要调用时去全局寻找,因此可以改变全局变量

    注意:

    要在函数内部声明这个变量,则在全局作用域中要事先定义(赋值)这个变量,同时在这个函数

    的局部作用域内不能存在相同变量名的变量,否则程序会出错

    nonlocal语句

    这个语句跟global语句的功能有些类似,区别在于它是在在局部作用域内改变外部函数作用域的变量

    那么在实际应用中这两个语句到底有什么用呢?

    举两个简单的例子

    1.

    L=[]        #全局变量--一个列表

    while   True:    #此处暂且定义一个死循环,可以根据实际修改循环条件

       def  fn1():

         global L    #在函数内部给列表添加数据

              L.append('abc')   #abc只是一个例子,每次调用fn1()都可以增添不同数据

    在循环内每次调用fn1函数都可以往列表中增添‘abc’字符串,如果L列表定义在函数内部,

    则每次调用函数都会初始化列表L,就没有意义了。所以global就有这么一个作用--实现

    全局变量在函数内部的修改。

    2.

    a=0

    def fn2():

        global a

        a+=1

        process

    fn2()

    fn2()

    这个例子反映global语句的作用是记录函数fn2函数被调用的次数,每次调用fn2函数,a都会自增1

    在函数外部可以根据变量a的值知道fn2函数被调用了多少次

    nonlocal语句的用法和global语句的用法差不多,读者可以依样画葫芦,敲敲代码就知道怎么用了,

    我在这里就不赘述了

  • 相关阅读:
    切分文本行
    oracle 导出【转】
    SQL 表A不在表B记录
    Oracle 数据库操作
    oracle 跨表更新
    WPF : ViewPort3D, ModelVisual3D XAML example
    WPF : 3D 最简单的WPF 3D
    WPF : StoryBoard用法
    WPF/SilverLight学习计划
    WPF : 3D 给GeometryModel3D对象贴图
  • 原文地址:https://www.cnblogs.com/thomson-fred/p/9383791.html
Copyright © 2020-2023  润新知