二者的关系:命名空间在python解释器中是以字典的形式存在的,是以一种可以看得见摸得着的实体存在的。大部分的命名空间都是由字典来实现的,里面存储的是键就是名字,值就是名字所指向的位于内存中的对象。作用域是python解释器定义的一种规则,该规则确定了运行时变量查找的顺序,是一种形而上的虚的规定。
命名空间有三种:
1.内置命名空间:里面存放的是python解释器一加载进内存就能直接使用的变量名,函数名,关键字等。python解释器已启动就会在内存空见中开辟一个内置命名空间。
2.全局命名空间:里面存放的是除函数里面的所有用户自定义的变量名和函数名,在程序从上到下执行的过程中会依次加载进全局命名空间。
3.局部命名空间:里面存放的是函数内部的所有用户自定义的变量名和函数名,在执行(调用)函数的时候加载进局部命名空间,当函数执行完后这个明明空间就消失了。(每一个递归函数都拥有自己的命名空间)。
作用域有两种:
1.全局作用域:作用在全局,内置命名空间和全局命名空间里面的名字都属于全局作用域。
2.局部作用域:作用在局部,局部命名空间的名字属于全局作用域。
global关键字
对于属于全局作用域的不可变数据类型,在局部作用域中可以直接引用,但不能直接修改,修改前应先用global关键字进行声明。
a = 1
def test():
a = 2
test()
print(a) # 1
a = 1
def test():
global a
a = 2
test()
print(a) # 2
globals和locals内置函数
globals:获取全局作用域里面的所有名字
locals:获取全局还是局部作用域里面的名字由调用locals的位置决定
a = 1
def test():
s1 = "s1"
s2 = "s2"
print(globals())
print(locals())
test()
print(globals())
print(locals())
结果: