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 中__name__ = '__main__' 的作用
Jul 05 Python
python字符串排序方法
Aug 29 Python
python实现将元祖转换成数组的方法
May 04 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
浅谈python可视化包Bokeh
Feb 07 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
将pandas.dataframe的数据写入到文件中的方法
Dec 07 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
Django 框架模型操作入门教程
Nov 05 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
Python字符串对齐方法使用(ljust()、rjust()和center())
Apr 26 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
PHP实现上传多图即时显示与即时删除的方法
2017/05/09 PHP
php unlink()函数使用教程
2018/07/12 PHP
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
yarn的使用与升级Node.js的方法详解
2017/06/04 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
寻找网站后台地址的python脚本
2014/09/01 Python
决策树的python实现方法
2014/11/18 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
numpy数组广播的机制
2019/07/12 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
python 连续不等式语法糖实例
2020/04/15 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
通息工程毕业生自荐信
2013/10/16 职场文书
校园文明标语
2014/06/13 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
繁星春水读书笔记
2015/06/30 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
python基础详解之if循环语句
2021/04/24 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python