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 01 Python
Python 多核并行计算的示例代码
Nov 07 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
TensorFlow实现简单卷积神经网络
May 24 Python
python字典一键多值实例代码分享
Jun 14 Python
python实现websocket的客户端压力测试
Jun 25 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
python json.dumps中文乱码问题解决
Apr 01 Python
python 装饰器的实际作用有哪些
Sep 07 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
php session 检测和注销
2009/03/16 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
2010/04/12 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
利用ES6语法重构React组件详解
2017/03/02 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
Vue 项目中遇到的跨域问题及解决方法(后台php)
2018/03/28 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
JavaScript原型继承和原型链原理详解
2020/02/04 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
Python读写unicode文件的方法
2015/07/10 Python
python实现画一颗树和一片森林
2018/06/25 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
广告语设计及教案
2014/03/21 职场文书
事业单位鉴定材料
2014/05/25 职场文书
Go语言测试库testify使用学习
2022/07/23 Golang