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 相关文章推荐
Cython 三分钟入门教程
Sep 17 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
深入解析Python中的集合类型操作符
Aug 19 Python
Python编程判断这天是这一年第几天的方法示例
Apr 18 Python
AI人工智能 Python实现人机对话
Nov 13 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
python实现一个简单的ping工具方法
Jan 31 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
Jun 13 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Python中and和or如何使用
May 28 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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访问查询mysql数据的三种方法
2006/10/09 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
node.js中的require使用详解
2014/12/15 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
Vue 2.5 Level E 发布了: 新功能特性一览
2017/10/24 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
python 对象和json互相转换方法
2018/03/22 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
Django web框架使用url path name详解
2019/04/29 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python字符串反转的四种方法详解
2019/12/02 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
道德大讲堂实施方案
2014/05/14 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
小组组名及励志口号
2015/12/24 职场文书
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript
ubuntu开机后ROS程序自启动问题
2022/12/24 Servers