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遍历指定文件及文件夹的方法
May 09 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
python实现员工管理系统
Jan 11 Python
python的继承知识点总结
Dec 10 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
python字符串拼接+和join的区别详解
Dec 03 Python
python 基于opencv实现图像增强
Dec 23 Python
python中的sys模块和os模块
Mar 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极大的增强功能和性能
2006/10/09 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
详解JS函数重载
2014/12/04 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
Vue 图片压缩并上传至服务器功能
2020/01/15 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
Python随机生成彩票号码的方法
2015/03/05 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
Python进行特征提取的示例代码
2020/10/15 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
巴黎一票通:The Paris Pass
2018/02/10 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
管理学专业个人求职信范文
2013/12/13 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
大学生求职自我评价
2014/01/16 职场文书
工程采购员岗位职责
2014/03/09 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书