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操作sqlite的CRUD实例分析
May 08 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
TensorFLow用Saver保存和恢复变量
Mar 10 Python
详解Python安装scrapy的正确姿势
Jun 26 Python
python实现点对点聊天程序
Jul 28 Python
Python----数据预处理代码实例
Mar 20 Python
django+echart数据动态显示的例子
Aug 12 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
在python中logger setlevel没有生效的解决
Feb 21 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
教大家制作简单的php日历
2015/11/17 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
在JavaScript中构建ArrayList示例代码
2014/09/17 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
使用canvas进行图像编辑的实例
2017/08/29 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
python分割文件的常用方法
2014/11/01 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
Python模块常用四种安装方式
2020/10/20 Python
C#中的验证控件有几种
2014/03/08 面试题
护理专业大学生自我推荐信
2014/01/25 职场文书
粗加工管理制度
2014/02/04 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
保密工作责任书
2014/04/16 职场文书
四风问题对照检查材料
2014/09/22 职场文书
大专护理专业自荐信
2015/03/25 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
vue router 动态路由清除方式
2022/05/25 Vue.js