命名空间
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,则最好别大量使用,定义一个类,将属性,方法保存在类中,用对象进行访问。
网友评论