美文网首页python知识点
python-命名空间、作用域,和局部函数

python-命名空间、作用域,和局部函数

作者: python_run | 来源:发表于2019-03-31 22:09 被阅读0次

    命名空间

    Python中变量的使用有作用域的问题,即命名空间(namespace)。任何在函数中 赋值的变量 默认都是被分配到局部命名空间(local namespace)中的。
    (千万注意此处赋值的变量这个描述,即在进行赋值的时候,接下来介绍的内容在python解释器中会发生作用)........
    局部命名空间是在函数被调用时创建的,函数参数会立即填入该命名空间。在函数执行完毕之后,局部命名空间就会被销毁

    命名空间作用时机

    首先介绍命名空间发生作用的两个特点:
    1.python解释器对于一个进行赋值的变量的访问顺序是局部命名空间,嵌套命名空间,全局命名空间,内置命名空间(即会按照这个顺序访问一个变量)
    2.在内存中实际的作用机制是:变量名称实际上保存的是对象的内存地址,即指向对象;而对象则真正保存了对象可以使用的属性,方法等,如下图


    图片.png

    命名空间的坑:

    1.局部空间和全局空间使用了相同的变量名,这会导致,python解释器首先从局部空间查找该变量,而由于在局部空间这是新创建的变量,其指向对象的值为none,所以往往会发生错误,


    图片.png

    如以下这个比较经典的例子:

    a = 0
    def func():
      a+=1
    UnboundLocalError: local variable 'a' referenced before assignment
    

    2.如果真的想要想要在局部空间里使用和全局空间里相同的变量名,如对全局变量进行自增操作,则可以使用global 变量名 来表示该变量。->其工作原理就是,直接从全局空间里查找该变量,不按照常规套路从局部空间里查找该变量。


    图片.png
    a = 0
    def func():
        global a
        a+=1
        print('局部:',a)
    func()
    print('全局:',a)
    输出结果:
    全局: 1
    局部: 1
    

    3.根据以上两点坑的介绍,大概明白了机制,本质上就是变量命名与对象之间的指向问题,所以只要把指向问题的坑避免了就可以避免程序bug,
    另外需要注意的是,虽然存在指向的问题,但是保存的对象的方法还是可以正常使用的,所以如果需要大量使用global,则最好别大量使用,定义一个类,将属性,方法保存在类中,用对象进行访问。

    相关文章

      网友评论

        本文标题:python-命名空间、作用域,和局部函数

        本文链接:https://www.haomeiwen.com/subject/urqpbqtx.html