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中的多条件排序实现
Jun 07 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
Django rest framework工具包简单用法示例
Jul 20 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
Python 实现一个简单的web服务器
Jan 03 Python
深入解析NumPy中的Broadcasting广播机制
May 30 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 中文处理函数集合
2008/08/27 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
2021/03/09 PHP
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
详解javascript遍历方式
2015/11/11 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
微信小程序 基础知识css样式media标签
2017/02/15 Javascript
js数组去重的方法总结
2019/01/18 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python读写文件方法总结
2015/06/09 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python实现textrank关键词提取
2018/06/22 Python
Python面向对象程序设计多继承和多态用法示例
2019/04/08 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
python可迭代对象去重实例
2020/05/15 Python
Python flask框架端口失效解决方案
2020/06/04 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
20年同学聚会感言
2014/02/03 职场文书
补充协议书范本
2014/04/23 职场文书
团日活动总结报告
2014/06/25 职场文书
2015年审计人员工作总结
2015/05/26 职场文书