Python中的函数作用域


Posted in Python onMay 07, 2018

在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 相关文章推荐
Python EOL while scanning string literal问题解决方法
Sep 18 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
python3编码问题汇总
Sep 06 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
python实现超简单的视频对象提取功能
Jun 04 Python
用Python3创建httpServer的简单方法
Jun 04 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
详解python中的线程与线程池
May 10 Python
python用for循环求和的方法总结
Jul 08 Python
django 使用全局搜索功能的实例详解
Jul 18 Python
python中count函数简单用法
Jan 05 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Php多进程实现代码
May 07 #Python
Python格式化输出%s和%d
May 07 #Python
python获取代理IP的实例分享
May 07 #Python
对python使用http、https代理的实例讲解
May 07 #Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 #Python
python使用代理ip访问网站的实例
May 07 #Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 #Python
You might like
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python 安装setuptools和pip工具操作方法(必看)
2017/05/22 Python
Python实现求数列和的方法示例
2018/01/12 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
技术人员面试提纲
2013/11/28 职场文书
门卫工作岗位职责
2013/12/17 职场文书
周鸿祎:教你写创业计划书
2013/12/30 职场文书
电力安全事故反思
2014/04/27 职场文书
淘宝活动总结范文
2014/06/26 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
保外就医申请书范文
2015/08/06 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书