Python 如何访问外围作用域中的变量
在表达式中引用变量时,Python 会按照如下的顺序遍历各个作用域,寻找该变量:
- 当前函数作用域
- 任何外围作用域(比如包含当前函数的其他函数)
- global 作用域,即代码所在的模块的作用域
如果上述作用域内都找不到变量,就会报 NameError 异常。
但是对变量赋值时,规则会有所不同。
- 如果当前作用域变量已存在,那么其值会被替换。
- 如果不存在,则会视为在当前作用域定义新变量,而不是向外围作用域中寻找。
如下函数
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中变量的作用域
理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量.例如: num = 100 def func(): num = 123 print num func() 输出结果是123.说明函数中定义的变量名num是一个局部变量,覆盖全局变量.再例如: num = 100 def func(): num += 100 print num func() 输出结果是:Unb
-
讲解python参数和作用域的使用
本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途.一. 创建函数函数是可以调用,它执行某种行为并且返回一个值.用def语句即可定义一个函数:(并非所有的函数都会返回一些东西) 复制代码 代码如下: def fibs(num): result = [0,1] for i in range(num-2): result.append(result[-2]+result[-1]) return result 记录函数如果想
-
Python中的作用域规则详解
Python是静态作用域语言,尽管它自身是一个动态语言.也就是说,在Python中变量的作用域是由它在源代码中的位置决定的,这与C有些相似,但是Python与C在作用域方面的差异还是非常明显的. 接下来会谈论Python的作用域规则,在这中间也会说明一下Python与C在作用域方面的不同. 在Python 2.0及之前的版本中,Python只支持3种作用域,即局部作用域,全局作用域,内置作用域:在Python 2.2中,Python正式引入了一种新的作用域 --- 嵌套作用域:在Python 2
-
解读Python编程中的命名空间与作用域
变量是拥有匹配对象的名字(标识符).命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典. 一个Python表达式可以访问局部命名空间和全局命名空间里的变量.如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量. 每个函数都有自己的命名空间.类的方法的作用域规则和通常函数的一样. Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的. 因此,如果要给全局变量在一个函数里赋值,必须使用global语句. global VarName的
-
讲解Python中for循环下的索引变量的作用域
我们从一个测试开始.下面这个函数的功能是什么? def foo(lst): a = 0 for i in lst: a += i b = 1 for t in lst: b *= i return a, b 如果你觉得它的功能是"计算lst中所有元素的和与积",不要沮丧.通常很难发现这里的错误.如果在大堆真实的代码中发现了这个错误就非常厉害了.--当你不知道这是一个测试时,很难发现这个错误. 这里的错误是在第二个循环体中使用了i而不是t.等下,这到底是怎么工作的?i在第一个循环外应该是
-
Python 如何访问外围作用域中的变量
在表达式中引用变量时,Python 会按照如下的顺序遍历各个作用域,寻找该变量: 当前函数作用域 任何外围作用域(比如包含当前函数的其他函数) global 作用域,即代码所在的模块的作用域 如果上述作用域内都找不到变量,就会报 NameError 异常. 但是对变量赋值时,规则会有所不同. 如果当前作用域变量已存在,那么其值会被替换. 如果不存在,则会视为在当前作用域定义新变量,而不是向外围作用域中寻找. 如下函数 def function(): flag = True def helper(
-
Python Print实现在输出中插入变量的例子
如果想在打印的字符串中的任意地方加入任意的变量,可以使用python的格式化输出. 用例如下: s = 'Hello' x = len(s) print("The length of %s is %d" % (s,x)) #Print :The length of Hello is 5 下面是关于格式化输出的一些总结: (1). %字符:标记转换说明符的开始 (2). 转换标志:-表示左对齐:+表示在转换值之前要加上正负号:""(空白字符)表示正数之前保留空格:0表
-
JS中的变量作用域(console版)
作用域说明:指一个变量的作用范围 1.全局作用域 (1) 全局作用域在页面打开时被创建,页面关闭时被销毁 (2) 编写在script标签中的变量和函数,作用域为全局,在页面的任意位置都可以访问到 (3) 在全局作用域中有全局对象window,代表一个浏览器窗口,由浏览器创建,可以直接调用 (4) 全局作用域中声明的变量和函数会作为window对象的属性和方法保存 var a = 10; b = 20; function an(){ console.log('an') } var bn = fun
-
python如何修改装饰器中参数
本文实例为大家分享了python修改装饰器中参数的具体代码,供大家参考,具体内容如下 案例: 为分析程序内哪些函数执行时间开销较大,我们需定义一个带timeout参数的装饰器 需求: 统计被装饰函数的运行时间 时间大于timeout时,将此次函数调用记录到log日志中 运行时可以修改timeout的值 如何解决这个问题? 定义一个装饰器,计算函数执行时间,并与timeout比较,当大于timeout时候,通过logging模块打印出日志信息 在包裹函数中添加一个函数,通过这个函数来修改timeo
-
python 名称空间与作用域详情
目录 一.名称空间 1.1 内置名称空间 1.2 全局名称空间 1.3 局部名称空间 1.4 加载顺序 1.5 查找顺序 二.作用域 2.1 全局作用域 2.2 局部作用域 2.4 函数对象+作用域应用 三.补充知识点 3.1 global关键字 3.2 nonlocal关键字 3.3 注意点 函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况. 一.名称空间 名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是
-
关于JS中的作用域中的问题思考分享
目录 作用域 全局作用域 作用域中的错误 局部作用域 with 弊端 数据泄露 性能下降 let const 作用域链 闭包 闭包对作用域链的影响 匿名函数的赋值 使用let 作用域 作用域,也就是我们常说的词法作用域,说简单点就是你的程序存放变量.变量值和函数的地方.根据作用范围不同可以分为全局作用域和局部作用域,简单说来就是,花括号 {}括起来的代码共享一块作用域,里面的变量都对内或者内部级联的块级作用域可见,这部分空间就是局部作用域,在 {}之外则是全局作用域. 全局作用域 在JavaSc
-
python 名称空间与作用域详情
目录 一.名称空间 1.1 内置名称空间 1.2 全局名称空间 1.3 局部名称空间 1.4 加载顺序 1.5 查找顺序 二.作用域 2.1 全局作用域 2.2 局部作用域 2.4 函数对象+作用域应用 三.补充知识点 3.1 global关键字 3.2 nonlocal关键字 3.3 注意点 函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况. 一.名称空间 名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是
-
解析Python中的变量、引用、拷贝和作用域的问题
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样.在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可.但是,当用变量的时候,必须要给这个变量赋值:如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义.如下: >>> a Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a'
-
Python中的变量和作用域详解
作用域介绍 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: G:globa,全局变量,就是模块级别定义的变量: B:built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB. x = int(2.9) # int bu
-
Python中设置变量访问权限的方法
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name.score属性: >>> bart = Student('Bart Simpson', 98) >>> bart.score 98 >>> bart.score = 59 >>> bart.score 59 如果要让内部属性不被外部
随机推荐
- angular4实现tab栏切换的方法示例
- CMD命令详解 目录类命令(md、cd、rd、dir、path、tree、deltree)
- 在Flex(Flash)中嵌入HTML代码或页面(Flex IFrame)
- sql server 2008 用户 NT AUTHORITY\IUSR 登录失败的解决方法
- 基于Vue单文件组件详解
- 详解 Java继承关系下的构造方法调用
- php IIS日志分析搜索引擎爬虫记录程序第1/2页
- php生成excel列名超过26列大于Z时的解决方法
- PHP 二维数组和三维数组的过滤
- PHP的PSR规范中文版
- python3中int(整型)的使用教程
- 关于背包问题的一些理解和应用
- Android中关于FragmentA嵌套FragmentB的问题
- ASP.NET用户注册实战(第11节)
- node.js解决获取图片真实文件类型的问题
- Python实现的检测网站挂马程序
- jQuery实现手机版页面翻页效果的简单实例
- JavaScript中对象property的读取和写入方法介绍
- apache 二级域名解析 (window与linux)
- LINUX 下软件包的安装与使用详解