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实现rest请求api示例
Apr 22 Python
python实现简单温度转换的方法
Mar 13 Python
python实现域名系统(DNS)正向查询的方法
Apr 19 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
如何用Python合并lmdb文件
Jul 02 Python
Python 支付整合开发包的实现
Jan 23 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
python requests指定出口ip的例子
Jul 25 Python
python yield和Generator函数用法详解
Feb 10 Python
Python基础学习之奇异的GUI对话框
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
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php数组去除空值函数分享
2015/02/02 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php时间计算相关问题小结
2016/05/09 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
python 获取et和excel的版本号
2009/04/09 Python
python中requests模块的使用方法
2015/04/08 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python win32 简单操作方法
2017/05/25 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
Python生成器generator用法示例
2018/08/10 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
2019/01/11 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
django使用xadmin的全局配置详解
2019/11/15 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
python程序输出无内容的解决方式
2020/04/09 Python
实习生单位鉴定意见
2013/12/04 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
县级文明单位申报材料
2014/05/23 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
python实现自定义日志的具体方法
2021/05/28 Python
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL