python中命名空间与作用域

Posted 铁子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中命名空间与作用域相关的知识,希望对你有一定的参考价值。

引子

 1 a = 1
 2 def func():
 3     print(a)   #输出结果:无任何输出
 4 
 5 a = 1
 6 def func():
 7     print(a)   #输出结果:无任何输出
 8 func()  #输出结果:1
 9 
10 def func():
11     a = 1
12 
13 func()
14 print(a)   #输出结果:NameError: name \'a\' is not defined

1:内置命名空间--python解释器

  python解释器一启动就可以使用的名字,存储在内置命名空间中内置的名字在启动解释器的时候被加载进内存里

2:全局命名空间--我们写的代码但不是函数中的代码

在程序从上到下被执行的过程中一次加载进内存的,放置了我们设置的所有变量名和函数名

3:局部命名空间

就是函数内部定义的名字,当调用函数的时候才会产生这个名称空间,随着函数执行的结束,这个命名空间就又消失了

在局部:可以使用全局,内置命名空间中的名字
在全局:可以使用内置命名空间中的名字,但是不能在局部中使用
在内置:不能使用局部和全局的名字


加载顺序:内置命名空间  全局命名空间   局部命名空间
局部调用顺序:局部命名空间 全局命名空间 内置命名空间

注意:

当我们在全局定义了和内置名字空间同名的名字时,会使用全局的名字,自己有就用自己的,如果自己没有就找上一级要,如果上一级没有再找上一级,都没有的话则报错

 

1 def max():
2     print(\'in max func\')
3 print(max())              #输出结果:in max func
4                           #          None

 

补充:

func函数名字指向的是函数的内存地址,然而函数名加括号即func(),就是函数的调用,多个函数应该拥有多个独立的局部名字空间,不互相共享,所以下面例子用法为错误的

1 def func1():
2     a = 1
3 
4 def func2():
5     print(a)

4:作用域两种

全局作用域--作用在全局--内置和全局名字空间中的名字都属于全局作用域
局部作用域--作用在局部--函数(局部名字空中的名字属于局部作用域)
#a为全局
1
a = 1 2 def func(): 3 a += 1

注意:

  对于不可变数据类型 在局部可查看作用域中的变量,但是不能直接修改,如果想要修改,需要在全局中
的一开始添加\'goobal’声明,如果在一个局部(函数)内声明一个global变量,那么这个变量在局部
的所有操作将对全局变量有效
1 def func():
2     global a
3     a = 2
4 
5 func()
6 print(a)

补充:

局部作用域的所有名字查看--locals

1 a = 1
2 b = 2
3 def func():
4     x = \'aaa\'
5     y = \'bbb\'
6     print(locals())
7 func()               #输出结果:{\'x\': \'aaa\', \'y\': \'bbb\'}

全局作用域所有名字的查看--global

 1 a = 1
 2 b = 2
 3 def func():
 4     x = \'aaa\'
 5     y = \'bbb\'
 6     print(locals())
 7 print(globals())
 8 # 输出结果:{\'__name__\': \'__main__\', \'__doc__\': None,
 9 # \'__package__\': None,
10 # \'__loader__\': <_frozen_importlib_external.SourceFileLoader object at 0x0354EED0>,
11 #  \'__spec__\': None, \'__annotations__\': {}, \'__builtins__\': <module \'builtins\' (built-in)>,
12 # \'__file__\': \'C:/Users/XZB/PycharmProjects/s1/day10/函数的命名空间.py\',
13 # \'__cached__\': None, \'a\': 1, \'func\': <function func at 0x056A9D68>, \'b\': 2}

 

如何避免使用global--通过传参和接收返回值

原代码:

1 a = 1
2 def func():
3     global a
4     a = 2
5 func()
6 print(a)

改进后代码:

1 a = 1
2 def func(a):
3     a = 2
4     return a
5 a - func(a)
6 print(a)

 

 

 

 

 

以上是关于python中命名空间与作用域的主要内容,如果未能解决你的问题,请参考以下文章

python进阶之命名空间与作用域

作用域与命名空间

python命名空间和作用域

Python_命名空间和作用域_25

11. python入门复习教程之命名空间与作用域,再谈异常,标准库,持久化与序列化

python之函数命名空间和作用域