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进行行为驱动开发的入门教程
Apr 23 Python
python实现的希尔排序算法实例
Jul 01 Python
python3编码问题汇总
Sep 06 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Django自定义列表 models字段显示方式
Apr 03 Python
关于Keras Dense层整理
May 21 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 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的Yii框架中的Controller控制器
2016/03/29 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
prototype 1.5 & scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
jQuery jcrop插件截图使用方法
2013/11/20 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
简单学习vue指令directive
2016/11/03 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
javascript 数组精简技巧小结
2020/02/26 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Django自定义用户认证示例详解
2018/03/14 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
python自动发微信监控报警
2019/09/06 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
团日活动策划书
2014/02/01 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
深入理解pytorch库的dockerfile
2022/06/10 Python
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle