zoukankan      html  css  js  c++  java
  • 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语句的用法差不多,读者可以依样画葫芦,敲敲代码就知道怎么用了,

    我在这里就不赘述了

  • 相关阅读:
    51 Nod 1086 多重背包问题(单调队列优化)
    51 Nod 1086 多重背包问题(二进制优化)
    51 Nod 1085 01背包问题
    poj 2559 Largest Rectangle(单调栈)
    51 Nod 1089 最长回文子串(Manacher算法)
    51 Nod N的阶乘的长度 (斯特林近似)
    51 Nod 1134 最长递增子序列(经典问题回顾)
    51 Nod 1020 逆序排列
    PCA-主成分分析(Principal components analysis)
    Python中cPickle
  • 原文地址:https://www.cnblogs.com/thomson-fred/p/9383791.html
Copyright © 2011-2022 走看看