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在linux中输出带颜色的文字的方法
Jun 19 Python
Python日志模块logging简介
Apr 13 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
python3+PyQt5实现柱状图
Apr 24 Python
Django 使用logging打印日志的实例
Apr 28 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
Python适配器模式代码实现解析
Aug 02 Python
python基于plotly实现画饼状图代码实例
Dec 16 Python
Python操作Excel把数据分给sheet
May 20 Python
python3中布局背景颜色代码分析
Dec 01 Python
Django migrate报错的解决方案
May 20 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中VC6、VC9、TS、NTS版本的区别与用法详解
2013/10/26 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php表单处理操作
2017/11/16 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
arguments对象
2006/11/20 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
Javascript Objects详解
2014/09/04 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
详解express + mock让前后台并行开发
2018/06/06 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python使用any判断一个对象是否为空的方法
2014/11/19 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
python机器学习之神经网络(三)
2017/12/20 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python os.listdir()乱码解决方案
2021/01/31 Python
Otel.com:折扣酒店预订
2017/08/24 全球购物
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
教师党员公开承诺书
2014/03/25 职场文书
地球一小时倡议书
2014/04/15 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
2014年人大工作总结
2014/12/10 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android