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中os和shutil模块实用方法集锦
May 13 Python
Python与shell的3种交互方式介绍
Apr 11 Python
解决Python requests 报错方法集锦
Mar 19 Python
python实现自动登录后台管理系统
Oct 18 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Node.js 和 Python之间该选择哪个?
Aug 05 Python
Django如何批量创建Model
Sep 01 Python
学习Python需要哪些工具
Sep 04 Python
python音频处理的示例详解
Dec 23 Python
Python趣味挑战之教你用pygame画进度条
May 31 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
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
js里怎么取select标签里的值并修改
2012/12/10 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
Python验证码识别的方法
2015/07/10 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
质检员的岗位职责
2013/11/15 职场文书
物业管理专业自荐信
2014/07/01 职场文书
班组拓展活动方案
2014/08/14 职场文书
个人创业事迹材料
2014/12/30 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
学校德育工作总结2015
2015/05/11 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL