Python中的函数作用域

yipeiwu_com6年前Python基础

在python中,一个函数就是一个作用域

name = 'xiaoyafei'
def change_name():
  name = '肖亚飞'
  print('在change_name里的name:',name)
change_name() # 调用函数
print("在外面的name:",name)

运行结果如下:

在change_name里的name: 肖亚飞
在外面的name: xiaoyafei

我们再试一下在嵌套函数中是如何的寻找的?

age = 15
def func():
  print('第一层age:',age) # 第一层age: 15
  def func2():
    age = 73
    print("func2中的age:",age) # func2中的age: 73
    def func3():
      age = 84
      print("func3中的age:",age) # func3中的age: 84
    func3() # 调用func3函数
  func2() # 调用func2函数
func()

在以上嵌套函数中,就能够很好的说明一个函数就是一个作用域,那么我们现在稍微改一下代码看看情况?

age = 15
def func():
  print('第一层age:',age) # 第一层age: 15
  def func2():
    print("func2中的age:",age) # func2中的age: 15 # 看到没有,如果当前作用域里没有age变量,那么它就会往上找
    def func3():
      age = 84
      print("func3中的age:",age) # func3中的age: 84
    func3() # 调用func3函数
  func2() # 调用func2函数
func()

那么,这时候有人就说了,屁话一大堆讲的原来是局部变量和全局变量,那么我想问:在上面这个嵌套函数中,func2中并没有age变量,那么它是如何找到全局变量age = 15的?

此时我们就需要来看一下作用域的查找顺序了:

变量作用域LEGB

  • L:locals 函数内的名称空间,包括局部变量和实参
  • E:enclosing 外部嵌套函数的名称空间,即相邻的上一层,打个比方说:func2中没有age变量则会去func里找这个
  • G:globals 全局变量
  • B:builtins 内置模块的名称空间

咳咳,还是先了解下什么是名称空间把?

名称空间,又名 name space ,顾名思义就是存放名字的地方,存什么名字呢?举例说明,x = 1 ,1存放在内存当中,那么变量名x存放在哪里呢? 名称空间就是存放名字x与1绑定关系的地方

>>> x = 1
>>> id(1)
1576430608

名称空间分为以下3种:

  • locals: 是函数内的名称空间,包括局部变量和形参
  • globals: 全局变量,函数定义所在模块的名字空间
  • builtins: 内置模块的名字空间

不同变量的作用域不同就是有这个变量所在的命名空间决定的.

作用域即范围

  • 全局范围:全局存活,全局有效
  • 局部范围:临时存货,局部有效

让我们来举例看一下

level = 'L0'
n = 22
def func():
  level = 'L1'
  n = 33
  print(locals()) # {'n': 33, 'level': 'L1'} 在之前说过在python中,一个函数就是一个作用域,这就很完美的体现了
  def outer():
    n = 44
    level = 'L2'
    print(locals(),n) # {'level': 'L2', 'n': 44} 44
    def inner():
      level = 'L3'
      print(locals(),n) # {'level': 'L3', 'n': 44} 44
    inner()
  outer()
func()

以 L --> E --> G -->B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置函数中找。

总结

以上所述是小编给大家介绍的python中的函数作用域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!

相关文章

Pycharm设置去除显示的波浪线方法

Pycharm设置去除显示的波浪线方法

近期安装了python后,发现使用pycharm工具打开代码后发现代码下边会有波浪线的显示;但是该代码语句确实没有错误,通过查询发现了两种方法去掉该波纹的显示,下面就具体说明一下: 方法...

pycharm 使用心得(三)Hello world!

pycharm 使用心得(三)Hello world!

1,新建一个项目 File --> New Project... 2,新建一个文件右键单击刚建好的helloWord项目,选择New --> Python File 3,...

python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法

Python的字符集处理实在蛋疼,目前使用UTF-8居多,然后默认使用的字符集是ascii,所以我们需要改成utf-8 查看目前系统字符集 复制代码 代码如下: import sys p...

2018年Python值得关注的开源库、工具和开发者(总结篇)

2018年Python值得关注的开源库、工具和开发者(总结篇)

1、开源库 Web 领域:Sanic  https://github.com/channelcat/sanic 这个库的名字和之前一个很火的梗有关,有人在 youtube...

mac下pycharm设置python版本的图文教程

mac下pycharm设置python版本的图文教程

安装了pycharm 5.0.1,创建了测试项目,发现python的版本是2.6.9的,系统自带的版本好像是2.7的,为什么这样,怎么切换到2.7 看了一下系统到底装了些什么版本 居...