主要内容:
小目标:函数的作用域 主要内容:局部变量,全局变量,LEGB原则,如果看完这篇文章,你还是弄不明白函数作用域; 你来找我,我保证不打你,我给你发100的大红包。
1. 命名空间
命名空间:对变量名分组,进行管理; 不同组的相同变量,视为两个变量 函数,类,方法,文件都会带来命名空间; 命名空间分为:LEGB命名空间:LEGB原则
Local:函数内的名字空间; Enclosed:外部嵌套函数的名字空间; Global:函数定义所在模块(文件)的名字空间; Built-in:Python内置模块的名字空间;
一个例子:
g = 10 def func(): x = 2 def foo(v): return pow(v,x) return foo
看下不同变量命名空间:
foo(v):v在foo内部,属于:Local x=2:x在func内部,对于func数据;Local x=2:对于foo函数来说,位于嵌套函数外部,属于Enclosed g=10:在文件内部,属于:Global pow:内置模块,属于Built-in
2. 作用域
2.1 作用域与命名空间关系: 命名空间是独立存在,存放着变量名与对象映射关系 程序中的变量如何找到对应的对象? 作用域:根据变量名,按照一定规则,对不同命名空间查找,找到变量名对应的对象。 2.2 作用域的LEGB原则:LEGB说明:
Local:局部变量,函数或者方法内部作用域; Enclosed:嵌套函数内部作用域; Global:全局变量,模块(文件)内部作用域; Built-in:Python内置变量;
LEGB查找元组: Local -> Enclosed -> Global -> Built-in 2.3 常见案例:例1:
x = 10 def func(v): print('in func x:', x) r = x*v return r func(3) print('in file x:', x)
结果:
in func x: 10 in file x: 10
分析:
func内部,没有x变量名,去上一层查找 全局变量:找到x=10,所以在func内部,x的值为10 print函数:Built-in
例2:
x = 10 def func(v): x = 2 print('in func x:',x) return x*v func(3) #调用func后,x的值是多少? print('in file x:', x)
结果:
in func x: 2 in file x: 10
分析:
func内部,x命名空间在func中,查找x时候,先从func内部查找,所以x为2 func内部:x=2,只是在func内部赋值,对全局的x没有任何影响;
例3:
x = 10 def func(v): r = x*v print('in func x:', x) x = 2 return r func(3) print('in file x:', x)
结果错误:使用了没有初始化变量
UnboundLocalError: local variable 'x' referenced before assignment
分析问题:
在func内部,定义变量x=2, 在x初始化前调用:r = x*v,使用了没有初始化的变量;
所以会出现上述问题。
3. globals()与locals()函数
globals():显示全局的变量 locals():显示函数内部变量例:
x = 10 def func(v): x = 2 r = x*v print("in func locals():", locals()) print("in func globals():", globals()) return r func(3)
结果:
in func locals(): {'v': 3, 'x': 2, 'r': 6} in func globals(): {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fc00c4de050>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 't1.py', '__cached__': None, 'x': 10, 'func': <function func at 0x7fc00c49c9e0>}
可以看到:在func内部与全局命名空间中都有变量x。
4. global与nonlocal关键字
global:在函数内部申明变量为全局变量 nonlocal:函数内部申明变量为外层函数的变量问题:如何在函数中修改全局变量?使用global
例:
x = 10 def changex(): global x x = 0 print('in changex x:', x) changex() print('out changex x:', x)
结果,对x修改全局有效:
in changex x: 0 out changex x: 0
总结:
理解作用域与命名空间 理解LEGB 这部分是面试中遇到问题查看更多关于21天学习python编程_作用域的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did170211