Python 如何访问外围作用域中的变量


Posted in Python onSeptember 11, 2016

在表达式中引用变量时,Python 会按照如下的顺序遍历各个作用域,寻找该变量:

  1. 当前函数作用域
  2. 任何外围作用域(比如包含当前函数的其他函数)
  3. global 作用域,即代码所在的模块的作用域

如果上述作用域内都找不到变量,就会报 NameError 异常。

但是对变量赋值时,规则会有所不同。

  1. 如果当前作用域变量已存在,那么其值会被替换。
  2. 如果不存在,则会视为在当前作用域定义新变量,而不是向外围作用域中寻找。

如下函数

def function():
  flag = True
  def helper():
    flag = False
  helper()
  print flag

function()

由于 helper 中变量是赋值,这里 flag 输出仍为 True。习惯了 c 语言之类静态类型语言,这种设计起初会感到困惑,但其可以有效地防止局部变量污染函数外的环境。

需求总是多样的,一定有程序员想在赋值时访问外围作用域。如果是 Python2,他可以这么做

def function():
  flag = [True]
  def helper():
    flag[0] = False
  helper()
  print flag

function()

先用 flag[0] 是读操作,产生一次变量引用,寻找到外围作用域中 flag,这时候再赋值 flag[0] = False 便不会新定义变量了。

如果是 Python3,则可以使用 nonlocal 关键字。

def function():
  flag = True
  def helper():
    nonlocal flag
    flag = False
  helper()
  print flag

function()
Python 相关文章推荐
python操作gmail实例
Jan 14 Python
Python实现获取某天是某个月中的第几周
Feb 11 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
解决python文件字符串转列表时遇到空行的问题
Jul 09 Python
pytorch 调整某一维度数据顺序的方法
Dec 08 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python Django里CSRF 对应策略详解
Aug 05 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
Django之腾讯云短信的实现
Jun 12 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
Python优化技巧之利用ctypes提高执行速度
Sep 11 #Python
Python 中的with关键字使用详解
Sep 11 #Python
Python冒泡排序注意要点实例详解
Sep 09 #Python
通过5个知识点轻松搞定Python的作用域
Sep 09 #Python
python验证码识别的实例详解
Sep 09 #Python
Python随机数random模块使用指南
Sep 09 #Python
利用ctypes提高Python的执行速度
Sep 09 #Python
You might like
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
PHP SOCKET编程详解
2015/05/22 PHP
非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程
2016/04/12 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
Python装饰器基础详解
2016/03/09 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
python中的for循环
2018/09/28 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
屏蔽Django admin界面添加按钮的操作
2020/03/11 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Python之字典对象的几种创建方法
2020/09/30 Python
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
企业指导教师评语
2014/04/28 职场文书
优秀教导主任事迹材料
2014/05/09 职场文书
2015年见习期工作总结
2014/12/12 职场文书
婚礼父母致辞
2015/07/28 职场文书
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA