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异步任务队列示例
Apr 01 Python
5种Python单例模式的实现方式
Jan 14 Python
python中map的基本用法示例
Sep 10 Python
Python绘制热力图示例
Sep 27 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
Python内置数据类型list各方法的性能测试过程解析
Jan 07 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
Feb 18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
学习Python需要哪些工具
Sep 04 Python
python 对一幅灰度图像进行直方图均衡化
Oct 27 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
python开发的自动化运维工具ansible详解
Aug 07 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
德生PL330测评
2021/03/02 无线电
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
dojo 之基础篇
2007/03/24 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
VUE+Element实现增删改查的示例源码
2020/11/23 Vue.js
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python selenium如何设置等待时间
2016/09/15 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
python3 求约数的实例
2019/12/05 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
高考自主招生自荐信
2013/10/20 职场文书
大四学生思想汇报
2014/01/13 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
财务工作失误检讨书
2015/02/19 职场文书
员工考勤管理制度
2015/08/06 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android