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 相关文章推荐
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
Python 从相对路径下import的方法
Dec 04 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
Dec 25 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
3种python调用其他脚本的方法
Jan 06 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
Apr 03 Python
python中线程和进程有何区别
Jun 17 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
python中如何打包用户自定义模块
Sep 23 Python
详解Flask开发技巧之异常处理
Jun 15 Python
python中的class_static的@classmethod的巧妙用法
Jun 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
1 Tube Radio
2021/03/02 无线电
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
js中将String转换为number以便比较
2014/07/08 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
[05:46]2018完美盛典-《同梦共竞》
2018/12/17 DOTA
详细讲解Python中的文件I/O操作
2015/05/24 Python
Python实现配置文件备份的方法
2015/07/30 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
关于廉洁的广播稿
2014/01/30 职场文书
本科毕业论文导师评语
2014/12/31 职场文书
客户付款通知书
2015/04/23 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
教师节领导致辞
2015/07/29 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书