欢迎访问Python教程网,我们的网址www.041b.com
python笔记21_函数作用域 – python教程 - python编程学习交流
python笔记21_函数作用域 – python教程 - python编程学习交流

python笔记21_函数作用域

奇猫2020-07-29 发布 python博文

主要内容:

小目标:函数的作用域
主要内容:局部变量,全局变量,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__': , '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': 't1.py', '__cached__': None, 'x': 10, 'func': }

可以看到:在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
这部分是面试中遇到问题

以上就是对python笔记21_函数作用域的相关介绍,希望对您自学python编程有所帮助!

转载原创文章请注明,转载自: python教程 - python笔记21_函数作用域 (https://www.041b.com/40766.html)

留言

写下你的评论吧

近期评论