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实现的防DDoS脚本
Feb 08 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
教你学会使用Python正则表达式
Sep 07 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
python绘制中国大陆人口热力图
Nov 07 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
如何在Python3中使用telnetlib模块连接网络设备
Sep 21 Python
Python中对象的比较操作==和is区别详析
Feb 12 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 adodb连接不同数据库
2009/03/19 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
一篇不错的Python入门教程
2007/02/08 Python
Python urlopen()函数 示例分享
2014/06/12 Python
详解supervisor使用教程
2017/11/21 Python
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
python获取当前文件路径以及父文件路径的方法
2019/07/10 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
介绍一下Linux中的链接
2016/06/05 面试题
英语文学专业学生的自我评价
2013/10/31 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
物业保安岗位职责
2014/07/02 职场文书
个人职业及收入证明
2014/10/13 职场文书
院系推荐意见
2015/06/05 职场文书
少年雷锋观后感
2015/06/10 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
创业计划书之水果店
2019/07/18 职场文书