详细见<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静态作用域名字搜索规则相关推荐

  1. python的作用域分别有几种_Python的作用域

    如果习惯了C/C++,Java这类静态语言的作用域规则,那么在Python中就要格外注意.在代码中,我们经常会碰到同一个变量名出现在多个地方,它的作用域可能是不一样的.Python中有四种作用域:局部 ...

  2. python作用域的理解-理解Python的UnboundLocalError(Python的作用域)

    今天写代码碰到一个百思不得解为什么会出错的代码,简化如下: 1 2 3 4 5 6 7 x=10 deffunc(): ifsomething_true(): x=20 print(x) func() ...

  3. 静态作用域与动态作用域的区别(转)

    在计算机程序设计中,变量是名字(name)与实体(entity)的绑定(binding).一段程序代码中所用到的名字并不总是有效(或者说:可用的),而限定这个变量名字具有可用性的代码范围就是这个名字的 ...

  4. js词法作用域(静态作用域)

    2019独角兽企业重金招聘Python工程师标准>>> function foo() { console.log(a); } function bar() {var a = 3; f ...

  5. Python 变量作用域

    变量作用域(scope)在Python中是一个容易掉坑的地方. Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Glob ...

  6. python静态变量_python静态变量

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我这里的代码实现了静态变量的装饰器. 但是,我发现如果我多次运行这个函数,每次调 ...

  7. python作用域顺序排列_详解Python函数作用域的LEGB顺序

    本文为大家介绍了Python函数作用域的查找顺序,供大家参考,具体内容如下 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局 ...

  8. python变量作用域 if,Python 变量作用域

    变量作用域(scope)在Python中是一个容易掉坑的地方. Python的作用域一共有4中,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (Glob ...

  9. python的作用域问题

    命名空间 python中的namespace (命名空间)是映射到对象的名称. 命名空间的几个常见示例: abs() 函数.内置异常等的内置函数集合:模块中的全局名称:函数调用中的局部名称.对象的属性 ...

最新文章

  1. VMware虚拟机 CentOS 6.5系统安装配置详细图文教程 --技术支持TPshop商城
  2. git查看 对比未提交_30分钟让你掌握Git的黑魔法
  3. Python实现Newton和lagrange插值
  4. excel 数据导入(附工具类)
  5. OpenCASCADE绘制测试线束:OCAF 命令之几何属性命令
  6. 百度地图API : 修改marker图标(icon)
  7. 绝对路径VS相对路径
  8. LintCode 375. 克隆二叉树(深复制)
  9. 彻底弄懂计算机中的大端小端
  10. sharepoint数据库连接
  11. Java—格式化日期/时间
  12. 硬板床害死中国人?西方人都睡软床垫?究竟是谁睡错了?
  13. 属性,初始化,类别,协议
  14. c 语言 初始化数组,C CodeBase:初始化一个数组
  15. 从命令行安装IIS 7.0
  16. 实战四:Kaggle自行车租赁预测比赛
  17. java 控制随机概率_【功能实现】实现设置概率的随机数
  18. 跟着小马哥学系列之 Spring AOP(AbstractAutoProxyCreator 详解)
  19. java类型参数推断_Java泛型类型推断
  20. html ul实现手机页面,手机端网页banner实现

热门文章

  1. 面试:Websocket
  2. 你好,了解一下Java 14带来的一系列新功能
  3. Linux下记住Gitee账户密码
  4. 消息队列面试 - 如何保证消息队列的高可用?
  5. 行为设计模式 - 模板方法设计模式
  6. java你画我猜源码_为什么看到Mybatis源码就感到烦躁?
  7. 【Python】密码生成器
  8. 【C语言】计算N名同学的某门功课的平均成绩
  9. 【C语言】逗号运算符的使用举例
  10. C#开发笔记之21-C#解析Json(序列化/反序列化)的最佳实践。