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代码
Mar 13 Python
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
Python实现聊天机器人的示例代码
Jul 09 Python
Sanic框架安装与简单入门示例
Jul 16 Python
python实现逐个读取txt字符并修改
Dec 24 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
jupyter修改文件名方式(TensorFlow)
Apr 21 Python
Python字符串格式化f-string多种功能实现
May 07 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 readfile下载大文件失败的解决方法
2017/05/22 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Fetch超时设置与终止请求详解
2019/05/18 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
python实现获取序列中最小的几个元素
2014/09/25 Python
python服务器端收发请求的实现代码
2014/09/29 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
深入浅析Python科学计算库Scipy及安装步骤
2019/10/12 Python
使用python实现kNN分类算法
2019/10/16 Python
python实现处理mysql结果输出方式
2020/04/09 Python
浅谈Python 函数式编程
2020/06/20 Python
详解python中的异常和文件读写
2021/01/03 Python
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
物理学专业求职信
2014/07/04 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
团支部书记竞选稿
2015/11/21 职场文书
五年级语文教学反思
2016/03/03 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android