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实现忽略大小写对字符串列表排序的方法
Sep 25 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python实现文件复制删除
Apr 19 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
python2.7 json 转换日期的处理的示例
Mar 07 Python
python实现将一个数组逆序输出的方法
Jun 25 Python
Python requests模块实例用法
Feb 11 Python
详解python tkinter模块安装过程
Jan 06 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
python中pivot()函数基础知识点
Jan 03 Python
Pytorch 如何实现常用正则化
May 27 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
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
javascript相关事件的几个概念
2015/05/21 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
简单的三步vuex入门
2018/05/20 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
Python for循环与getitem的关系详解
2020/01/02 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
python访问hdfs的操作
2020/06/06 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
C++的几个面试题附答案
2016/08/03 面试题
一道SQL存储过程面试题
2016/10/07 面试题
财务会计自荐信范文
2014/02/21 职场文书
2014小学二年级班主任工作总结
2014/12/05 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
2016入党心得体会范文
2016/01/06 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python