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八大排序算法速度实例对比
Dec 06 Python
分分钟入门python语言
Mar 20 Python
在双python下设置python3为默认的方法
Oct 31 Python
python爬取淘宝商品销量信息
Nov 16 Python
python文件拆分与重组实例
Dec 10 Python
python实现简单加密解密机制
Mar 19 Python
Python安装Flask环境及简单应用示例
May 03 Python
浅谈Python中(&,|)和(and,or)之间的区别
Aug 07 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
Python接口测试结果集实现封装比较
May 01 Python
10个示例带你掌握python中的元组
Nov 23 Python
详解pandas apply 并行处理的几种方法
Feb 24 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的FTP学习(四)
2006/10/09 PHP
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
JS编程小常识很有用
2012/11/26 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
解读! Python在人工智能中的作用
2017/11/14 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
Python猴子补丁知识点总结
2020/01/05 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
2014年公司庆元旦活动方案
2014/03/05 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
期末个人总结范文
2015/02/13 职场文书
学校证明范文
2015/06/24 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书