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 相关文章推荐
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python及PyCharm下载与安装教程
Nov 18 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
Python中一般处理中文的几种方法
Mar 06 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
用python写测试数据文件过程解析
Sep 25 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 Python
python是怎么被发明的
Jun 15 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
pyqt5实现井字棋的示例代码
Dec 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 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php学习之 循环结构实现代码
2011/06/09 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python检测服务器端口代码实例
2019/08/31 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
python退出循环的方法
2020/06/18 Python
娱乐地球:Entertainment Earth
2020/01/08 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
小学生环保标语
2014/06/13 职场文书
运动会广播稿200字
2015/08/19 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript