名字空间

Python 的名字空间是 Python 一个非常核心的内容。 其他语言中如 C 中,变量名是内存地址的别名,而在 Python 中,名字是一个字符串对象,它与他指向的对象构成一个{name:object}关联。 Python 由很多名字空间,而 LEGB 则是名字空间的一种查找规则。

作用域

Python 中name-object的关联存储在不同的作用域中,各个不同的作用域是相互独立的。而我们就在不同的作用域中搜索name-object。

举个栗子,来说明作用域是相互独立的。In[11]: i ="G"In[12]:def test():            i ="L"print i,"in locals"....:In[13]: test()        L in localsIn[14]:print i,"in globals"        G in globals

在上面的栗子中,我们定义了两次 i,在 test 函数中是 i-L,在外面是 i-G。为什么在 test 函数中,我们 i 指向的是对象 L,而在外面,i 指向的则是 G?这就是 LEGB 的作用。

简述

简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> builtinslocals 是函数内的名字空间,包括局部变量和形参

enclosing 外部嵌套函数的名字空间(闭包中常见)

globals 全局变量,函数定义所在模块的名字空间

builtins 内置模块的名字空间

所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,后是到 builtins 里面来检索。

当然,因为 builtins 的特殊性,我们可以直接在 builtins 里面添加变量,这样就可以在任意模块中访问变量,不过这种方法太过于变态,不推荐这么做。

locals,globals

函数的形参跟内部变量都存储在 locals 中。In[1]:def f(x):...:     a = x   ...:print a   ...:print locals()...:In[2]: f("hello")hello{'a':'hello','x':'hello'}

不过在函数内部调用global 声明的时候,可以将变量存储在 globals 中In[6]:def f(x):...:global a   ...:     a = x   ...:print a   ...:print locals()...:In[7]: f("hello")hello{'x':'hello'}In[8]:print ahelloIn[9]:print x---------------------------------------------------------------------------NameErrorTraceback(most recent call last)in()---->1print xNameError: name 'x'isnotdefined

如上面栗子中那样,在函数中声明 a 为全局变量,则函数 f 的 locals只有参数 x,而没有变量,而在外部可以使用变量 a,而使用 x 的时候则是NameError

Enclosed

Enclosing 是外部嵌套函数的名字空间。我们经常在闭包中用到。在 Python3中提供了一个 nonlocal关键字来修改外部嵌套函数的名字空间,但是要使用 Python3才有,我等使用 Python2的只能眼馋一下。In[11]:def outer():....:     a_var ='enclosed value'....:print a_var   ....:def inner():....:         a_var ='local value'....:print(a_var)....:     inner()....:print a_var   ....:In[12]: outer()enclosed valuelocal valueenclosed value

下面的栗子简单示范一下 nonlocal 的用法,实在 Python3下面才可以正常运行的:In[1]: a_var ='global value'In[2]:def outer():...:     a_var ="local value"...:print("outer befor", a_var)...:def inner():...:nonlocal a_var   ...:         a_var ="inner value"...:print("in inner():", a_var)...:     inner()...:print("outer inner:", a_var)...:In[3]: outer()outer befor local valuein inner(): inner valueouter inner: inner valueIn[4]:print(a_var)global value## builtins

builtins 则是内置模块,轻易不要修改In[19]: b---------------------------------------------------------------------------NameErrorTraceback(most recent call last)in()---->1 bNameError: name 'b'isnotdefinedIn[20]: __builtins__.b ="builtins"In[21]: bOut[21]:'builtins'

作者: 慕码人1111658 链接:https://www.imooc.com/article/21756来源:慕课网

python legb_理解 Python 的 LEGB.相关推荐

  1. 【Python】理解Python(1) - Python数据模型,is关键字,类型

    文章目录 Python的数据模型 对象的标识 对象的类型 对象的值 is 关键字 判断一个变量是否指向函数 types模块中定义的类型 本文是作者对Python官方文档的理解和试验结果,不保证技术准确 ...

  2. python processpoolexecutor_理解Python的PoolExecutor

    Demo代码和引用知识点都参考自<理解Python并发编程一篇就够了|PoolExecutor篇>--董伟明或作者个人公众号Python之美, <Python Cookbook> ...

  3. Python - 深刻理解Python中的元类(metaclass)

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 1.类也是对象 在理解元类之前,你需要先掌握Pyth ...

  4. 【Python】理解Python(2) - help() 函数? or 类?

    文章目录 help() 函数 help()详解 help不是一个函数 help的导入过程 object.\_\_call__(self [, args ...]) 函数 site.py模块 与 -S ...

  5. python nonetype_理解Python中的NoneType对象

    编译:老齐 在C.Java等类型的语言中,都有null,它常常被定义为与0等效.但是,在Python中并非如此.Python中用关键词None表征null对象,它并不是0,它是Python中的第一类对 ...

  6. python函数理解,python对函数的理解

    函数 函数可以提高编写代码效率.代码的重用.让程序更小.模块化 可以将一段独立功能的代码集成在一个块中.封装独立功能 # 函数定义(参数名为形式参数) def 函数名(参数名): 函数体 # 调用函数 ...

  7. 我对python的理解_python高级函数以及我对python的理解

    常见的高级函数:lambda.map.reduce.filter.list comprehension lambda 匿名函数,限制一个表达式 m = lambda x,y:x+y # 5 m(2,3 ...

  8. python self理解_Python列表理解

    python self理解 In our previous tutorial we learned about Python Sort List. In this tutorial we will l ...

  9. 几行代码理解Python变量访问的LEGB顺序

    Python变量访问时有个LEGB原则,也就是说,变量访问时搜索顺序为Local ==> Enclosing ==> Global ==> Builtin,听起来好像很高深的样子,实 ...

最新文章

  1. 两地控制的项目要求_项目两地控制灯照明线路的安装.ppt
  2. iOS APP提交上架流程
  3. TCP/IP协议的深入分析
  4. 面向对象-多态的实现
  5. Windows系统下oracle数据库每天定时备份
  6. Windows 下命令行修改文件夹的控制权限 Cacls
  7. Redis事务与MySQL事务的区别
  8. 求助文,缺少stubs-n32_hard.h
  9. 什么是ssl证书,ssl证书有哪几种类型?
  10. C语言程序设计(第三版)何钦铭著 习题5-3
  11. html5充值页面(Vue)
  12. 如何快速学习STAR-CCM+软件解决工程实际问题
  13. dnspod java_使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法
  14. 计算机进制转换小程序
  15. Spring Aop(五)——给Advice传递参数
  16. ubuntu-sudo命令
  17. uni-app 微信小程序提示音一闪而逝
  18. 研究生阶段该怎么学习
  19. Oracle查看表占用空间
  20. 中国纯电动车新车质量蔚来、特斯拉、欧拉列前三;长城汽车计划将P系列皮卡推向全球市场 | 美通企业日报...

热门文章

  1. LeetCode——双指针
  2. ​Linux CPU 性能优化指南
  3. 关于小程序·云开发峰会,你想get的干货全在这了!
  4. 腾讯朱华:数据中心下一个风向的探索
  5. PMM (Percona MySQL Monitor) 部署
  6. Java 函数式接口以及Lambda举例
  7. leetcode 1721. Swapping Nodes in a Linked List | 1721. 交换链表中的节点(Java)
  8. leetcode 222. Count Complete Tree Nodes | 222. 完全二叉树的节点个数(Java)
  9. python -- 计算 平方、乘方、平方根_从零开始学习PYTHON3讲义(二)把Python当做计算器...
  10. Spring的WebClient基本使用