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守护进程用法实例分析
Jun 04 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
Python读写文件基础知识点
Jun 10 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
python解释器spython使用及原理解析
Aug 24 Python
Python列表list操作相关知识小结
Jan 29 Python
Django Form常用功能及代码示例
Oct 13 Python
Python打包为exe详细教程
May 18 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
Python中的程序流程控制语句
Feb 24 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
跟我学Laravel之视图 & Response
2014/10/15 PHP
php 类自动载入的方法
2015/06/03 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
JavaScript 函数调用规则
2009/09/14 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
layer弹出层框架alert与msg详解
2017/03/14 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
js中数组对象去重的两种方法
2019/01/18 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
python中的多重继承实例讲解
2014/09/28 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
pytorch的batch normalize使用详解
2020/01/15 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
python中的对数log函数表示及用法
2020/12/09 Python
毕业生如何写自荐信
2014/03/26 职场文书
2015年公司新年寄语
2014/12/08 职场文书
关于运动会的广播稿
2015/08/19 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
解读Vue组件注册方式
2021/05/15 Vue.js
Python破解极验滑动验证码详细步骤
2021/05/21 Python
java开发双人五子棋游戏
2022/05/06 Java/Android