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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
在Django的上下文中设置变量的方法
Jul 20 Python
Python中类型检查的详细介绍
Feb 13 Python
答题辅助python代码实现
Jan 16 Python
使用Python读取大文件的方法
Feb 11 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
Python实现的KMeans聚类算法实例分析
Dec 29 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
使用AJAX和Django获取数据的方法实例
Oct 25 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+MSSQL分页的例子
2006/10/09 PHP
PHP实现采集中国天气网未来7天天气
2014/10/15 PHP
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
jQuery图片缩放插件smartZoom使用实例详解
2017/08/25 jQuery
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
Python中的map、reduce和filter浅析
2014/04/26 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
Python @property使用方法解析
2019/09/17 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
CSS3.0实现霓虹灯按钮动画特效的示例代码
2021/01/12 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
2015年创先争优活动总结
2015/03/27 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
七个非常实用的Python工具包总结
2021/06/15 Python
html粘性页脚的具体使用
2022/01/18 HTML / CSS
Python函数对象与闭包函数
2022/04/13 Python
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android