python函数的作用域及关键字详解


Posted in Python onAugust 20, 2019

函数的作用域

python中的作用域分4种情况:

  • L:local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

local和enclosing是相对的,enclosing变量相对上层来说也是local。

作用域产生

在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的;def、class、lambda是可以引入新作用域的。

global关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下

count = 10
def outer():
  global count#必须先声明count为全局变量
  print(count)
  count = 100
  print(count)
outer()

nonlocal关键字

global关键字声明的变量必须在全局作用域上,不能嵌套作用域上,当要修改嵌套作用域(enclosing作用域,外层非全局作用域)中的变量时就需要nonlocal关键字了

def outer():
  count = 10
  def inner():
    nonlocal count #此时count非全局变量,不能用global声明,需要用到nonlocal关键字
    count = 20
    print(count)
  inner()
  print(count)
outer()

作用域小结

(1)变量查找顺序:LEGB,作用域局部>外层作用域>当前模块中的全局>python内置作用域;

(2)只有模块、类、及函数才能引入新作用域;

(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;

(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中操作列表之List.append()方法的使用
May 20 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python探索之爬取电商售卖信息代码示例
Oct 27 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
Nov 17 Python
python高阶爬虫实战分析
Jul 29 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python3射线法判断点是否在多边形内
Jun 28 Python
Python socket模块方法实现详解
Nov 05 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
教你用python实现12306余票查询
Jun 30 Python
pytorch 可视化feature map的示例代码
Aug 20 #Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 #Python
python爬虫 urllib模块url编码处理详解
Aug 20 #Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 #Python
python web框架 django wsgi原理解析
Aug 20 #Python
opencv转换颜色空间更改图片背景
Aug 20 #Python
pytorch 预训练层的使用方法
Aug 20 #Python
You might like
PHP集成FCK的函数代码
2008/09/27 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
js正文内容高亮效果的实现方法
2013/06/30 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
2015/03/03 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python读写Excel文件的实例
2013/11/01 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
岗位职责范本
2013/11/23 职场文书
致接力运动员广播稿
2014/02/17 职场文书
2014全国两会心得体会
2014/03/17 职场文书
个人整改方案范文
2014/10/25 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
使用Django实现商城验证码模块的方法
2021/06/01 Python
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
实现GO语言对数组切片去重
2022/04/20 Golang