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 相关文章推荐
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
python算法题 链表反转详解
Jul 02 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python如何用filter函数筛选数据
Mar 05 Python
python3.x中安装web.py步骤方法
Jun 23 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
python压包的概念及实例详解
Feb 17 Python
python pygame 愤怒的小鸟游戏示例代码
Feb 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中使用Oracle数据库(3)
2006/10/09 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
Thinkphp5.0框架视图view的模板布局用法分析
2019/10/12 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
2018/05/23 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
Python爬取读者并制作成PDF
2015/03/10 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
机器学习python实战之决策树
2017/11/01 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
微信小程序python用户认证的实现
2019/07/29 Python
python3 pillow模块实现简单验证码
2019/10/31 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
高中运动会广播稿
2014/01/21 职场文书
商业街策划方案
2014/05/31 职场文书
长江三峡导游词
2015/01/31 职场文书
2015年团支书工作总结
2015/04/03 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL