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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Python生成词云的实现代码
Jan 14 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
用Python绘制漫步图实例讲解
Feb 26 Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 Python
Django中ORM的基本使用教程
Dec 22 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
使用PHP制作新闻系统的思路
2006/10/09 PHP
PHP实现验证码校验功能
2017/11/16 PHP
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
Python lxml模块安装教程
2015/06/02 Python
python写一个md5解密器示例
2018/02/23 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python使用正则筛选信用卡
2019/01/27 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
南威尔士家居商店:Leekes
2016/10/25 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
PHP经典面试题
2016/09/03 面试题
JDO的含义
2012/11/17 面试题
教师找工作推荐信
2013/11/23 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
中国梦党课学习心得体会
2016/01/05 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
粗暴解决CUDA out of memory的问题
2021/05/22 Python
图文详解nginx日志切割的实现
2022/01/18 Servers
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫