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使用reportlab画图示例(含中文汉字)
Dec 03 Python
python使用三角迭代计算圆周率PI的方法
Mar 20 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
TensorFlow实现Batch Normalization
Mar 08 Python
python基础教程项目五之虚拟茶话会
Apr 02 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python requests接口测试实现代码
Sep 08 Python
基于PyTorch中view的用法说明
Mar 03 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP导出EXCEL快速开发指南--PHPEXCEL的使用详解
2013/06/03 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP反射实际应用示例
2019/04/03 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
JS遍历页面所有对象属性及实现方法
2016/08/01 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
详解vue中组件参数
2018/07/09 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
vue+ts下对axios的封装实现
2020/02/18 Javascript
5个你不知道的JavaScript字符串处理库(小结)
2020/06/01 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
Python操作MySQL简单实现方法
2015/01/26 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
劳动竞赛活动方案
2014/02/20 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书