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 logging类库使用例子
Nov 22 Python
总结Python编程中三条常用的技巧
May 11 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
使用python实现knn算法
Dec 20 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
python学生信息管理系统(完整版)
Apr 05 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
Jan 05 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
Python读取xlsx文件的实现方法
Jul 04 Python
解决jupyter notebook import error但是命令提示符import正常的问题
Apr 15 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
动态表格Table类的实现
2009/08/26 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
Vue.set()实现数据动态响应的方法
2018/02/07 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
JS实现简易计算器
2020/02/14 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python多线程原理与用法详解
2018/08/20 Python
python tornado修改log输出方式
2019/11/18 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
应用化学专业本科生求职信
2013/09/29 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
文明学生事迹材料
2014/01/29 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
总经理检讨书
2014/09/15 职场文书
小学优秀学生评语
2014/12/29 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python