Python静态作用域名字搜索规则
详细见<Python进阶_关于命名空间与作用域(详解)>https://www.jb51.net/article/114951.htm
在程序中引用了一个名字,Python是怎样搜索到这个名字呢?
在程序运行时,至少存在三个命名空间可以被直接访问的作用域:
Local
首先搜索,包含局部名字的最内层(innermost)作用域,如函数/方法/类的内部局部作用域;
Enclosing
根据嵌套层次从内到外搜索,包含非局部(nonlocal)非全局(nonglobal)名字的任意封闭函数的作用域。如两个嵌套的函数,内层函数的作用域是局部作用域,外层函数作用域就是内层函数的 Enclosing作用域;
Global
倒数第二次被搜索,包含当前模块全局名字的作用域;
Built-in
最后被搜索,包含内建名字的最外层作用域。
程序运行时,LGB三个作用域是一定存在的,E作用域不一定存在;
经典官方示例:
def scope_test():def do_local():spam = 'local spam'def do_nonlocal():nonlocal spam # 当外层作用域不存在spam名字时,nonlocal不能像global那样自作主张定义一个spam = 'nonlocal spam' # 自由名字spam经nonlocal声明后,可以做重绑定操作了,可写的。def do_global():global spam # 即使全局作用域中没有名字spam的定义,这个语句也能在全局作用域定义名字spamspam = 'global spam' # 自有变量spam经global声明后,可以做重绑定操作了,可写的。spam = 'test spam'do_local()print("After local assignment:", spam) # After local assignment: test spamdo_nonlocal()print("After nonlocal assignment:", spam) # After nonlocal assignment: nonlocal spamdo_global()print("After global assignment:", spam) # After global assignment: nonlocal spamscope_test()
print("In global scope:", spam) # In global scope: global spam
试一试:
# coding=utf-8
def test1():print(i)'''test1()NameError: name 'i' is not defined
print()从LGB空间都没找到自由变量i!!!
'''def test2():print(i)i=2'''test2()UnboundLocalError: local variable 'i' referenced before assignment
test2()定义了局部变量i,但是print()在i赋值前被引用!!!
'''def test3():print(i)i=2test3()
'''
2
'''
def test4():i=1print(i)i=2test4()
print(i)
'''
1
2
'''def test5():global ii=1print(i)i=2test5()
print(i)
'''
1
1
'''def test6():global ii=3print(i)test6()
print(i)
'''
3
3
''''''def test7():nonlocal i #绑定到外部的ii=3print(i)i=1
test7()
print(i)SyntaxError: no binding for nonlocal 'i' found
'''
def test8():i=9def temp():nonlocal i #绑定到外部的ii=10print(i)temp()print(i)test8()
'''
9
10
'''
print(test8.__globals__)
'''
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000001D5C2E8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\li\\workspace\\temp\\e\\ttt\\try6.py', '__cached__': None, 'test1': <function test1 at 0x00000000004D4E18>, 'test2': <function test2 at 0x00000000027AF268>, 'test3': <function test3 at 0x0000000002930840>, 'i': 3, 'test4': <function test4 at 0x00000000029308C8>, 'test5': <function test5 at 0x0000000002930950>, 'test6': <function test6 at 0x00000000029309D8>, 'test8': <function test8 at 0x0000000002930A60>}
'''
Python静态作用域名字搜索规则相关推荐
- python的作用域分别有几种_Python的作用域
如果习惯了C/C++,Java这类静态语言的作用域规则,那么在Python中就要格外注意.在代码中,我们经常会碰到同一个变量名出现在多个地方,它的作用域可能是不一样的.Python中有四种作用域:局部 ...
- python作用域的理解-理解Python的UnboundLocalError(Python的作用域)
今天写代码碰到一个百思不得解为什么会出错的代码,简化如下: 1 2 3 4 5 6 7 x=10 deffunc(): ifsomething_true(): x=20 print(x) func() ...
- 静态作用域与动态作用域的区别(转)
在计算机程序设计中,变量是名字(name)与实体(entity)的绑定(binding).一段程序代码中所用到的名字并不总是有效(或者说:可用的),而限定这个变量名字具有可用性的代码范围就是这个名字的 ...
- js词法作用域(静态作用域)
2019独角兽企业重金招聘Python工程师标准>>> function foo() { console.log(a); } function bar() {var a = 3; f ...
- Python 变量作用域
变量作用域(scope)在Python中是一个容易掉坑的地方. Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Glob ...
- python静态变量_python静态变量
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我这里的代码实现了静态变量的装饰器. 但是,我发现如果我多次运行这个函数,每次调 ...
- python作用域顺序排列_详解Python函数作用域的LEGB顺序
本文为大家介绍了Python函数作用域的查找顺序,供大家参考,具体内容如下 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局 ...
- python变量作用域 if,Python 变量作用域
变量作用域(scope)在Python中是一个容易掉坑的地方. Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Glob ...
- python的作用域问题
命名空间 python中的namespace (命名空间)是映射到对象的名称. 命名空间的几个常见示例: abs() 函数.内置异常等的内置函数集合:模块中的全局名称:函数调用中的局部名称.对象的属性 ...
最新文章
- VMware虚拟机 CentOS 6.5系统安装配置详细图文教程 --技术支持TPshop商城
- git查看 对比未提交_30分钟让你掌握Git的黑魔法
- Python实现Newton和lagrange插值
- excel 数据导入(附工具类)
- OpenCASCADE绘制测试线束:OCAF 命令之几何属性命令
- 百度地图API : 修改marker图标(icon)
- 绝对路径VS相对路径
- LintCode 375. 克隆二叉树(深复制)
- 彻底弄懂计算机中的大端小端
- sharepoint数据库连接
- Java—格式化日期/时间
- 硬板床害死中国人?西方人都睡软床垫?究竟是谁睡错了?
- 属性,初始化,类别,协议
- c 语言 初始化数组,C CodeBase:初始化一个数组
- 从命令行安装IIS 7.0
- 实战四:Kaggle自行车租赁预测比赛
- java 控制随机概率_【功能实现】实现设置概率的随机数
- 跟着小马哥学系列之 Spring AOP(AbstractAutoProxyCreator 详解)
- java类型参数推断_Java泛型类型推断
- html ul实现手机页面,手机端网页banner实现