python legb_理解 Python 的 LEGB.
名字空间
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.相关推荐
- 【Python】理解Python(1) - Python数据模型,is关键字,类型
文章目录 Python的数据模型 对象的标识 对象的类型 对象的值 is 关键字 判断一个变量是否指向函数 types模块中定义的类型 本文是作者对Python官方文档的理解和试验结果,不保证技术准确 ...
- python processpoolexecutor_理解Python的PoolExecutor
Demo代码和引用知识点都参考自<理解Python并发编程一篇就够了|PoolExecutor篇>--董伟明或作者个人公众号Python之美, <Python Cookbook> ...
- Python - 深刻理解Python中的元类(metaclass)
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 1.类也是对象 在理解元类之前,你需要先掌握Pyth ...
- 【Python】理解Python(2) - help() 函数? or 类?
文章目录 help() 函数 help()详解 help不是一个函数 help的导入过程 object.\_\_call__(self [, args ...]) 函数 site.py模块 与 -S ...
- python nonetype_理解Python中的NoneType对象
编译:老齐 在C.Java等类型的语言中,都有null,它常常被定义为与0等效.但是,在Python中并非如此.Python中用关键词None表征null对象,它并不是0,它是Python中的第一类对 ...
- python函数理解,python对函数的理解
函数 函数可以提高编写代码效率.代码的重用.让程序更小.模块化 可以将一段独立功能的代码集成在一个块中.封装独立功能 # 函数定义(参数名为形式参数) def 函数名(参数名): 函数体 # 调用函数 ...
- 我对python的理解_python高级函数以及我对python的理解
常见的高级函数:lambda.map.reduce.filter.list comprehension lambda 匿名函数,限制一个表达式 m = lambda x,y:x+y # 5 m(2,3 ...
- python self理解_Python列表理解
python self理解 In our previous tutorial we learned about Python Sort List. In this tutorial we will l ...
- 几行代码理解Python变量访问的LEGB顺序
Python变量访问时有个LEGB原则,也就是说,变量访问时搜索顺序为Local ==> Enclosing ==> Global ==> Builtin,听起来好像很高深的样子,实 ...
最新文章
- 两地控制的项目要求_项目两地控制灯照明线路的安装.ppt
- iOS APP提交上架流程
- TCP/IP协议的深入分析
- 面向对象-多态的实现
- Windows系统下oracle数据库每天定时备份
- Windows 下命令行修改文件夹的控制权限 Cacls
- Redis事务与MySQL事务的区别
- 求助文,缺少stubs-n32_hard.h
- 什么是ssl证书,ssl证书有哪几种类型?
- C语言程序设计(第三版)何钦铭著 习题5-3
- html5充值页面(Vue)
- 如何快速学习STAR-CCM+软件解决工程实际问题
- dnspod java_使用dnspod遭遇的奇特问题以及背后的原因与临时解决方法
- 计算机进制转换小程序
- Spring Aop(五)——给Advice传递参数
- ubuntu-sudo命令
- uni-app 微信小程序提示音一闪而逝
- 研究生阶段该怎么学习
- Oracle查看表占用空间
- 中国纯电动车新车质量蔚来、特斯拉、欧拉列前三;长城汽车计划将P系列皮卡推向全球市场 | 美通企业日报...
热门文章
- LeetCode——双指针
- ​Linux CPU 性能优化指南
- 关于小程序·云开发峰会,你想get的干货全在这了!
- 腾讯朱华:数据中心下一个风向的探索
- PMM (Percona MySQL Monitor) 部署
- Java 函数式接口以及Lambda举例
- leetcode 1721. Swapping Nodes in a Linked List | 1721. 交换链表中的节点(Java)
- leetcode 222. Count Complete Tree Nodes | 222. 完全二叉树的节点个数(Java)
- python -- 计算 平方、乘方、平方根_从零开始学习PYTHON3讲义(二)把Python当做计算器...
- Spring的WebClient基本使用