python 变量搜寻顺序法则LEGB之E注意事项
众所周知,在python中,变量不需要事先声明,赋值后,即可调用使用。而调用的法则遵从LEGB法则,其中L为local,E为enclosing,G为Global,B为built-in,即变量首先在局部搜索,比如一个函数中,如果没有搜寻到,则继续在enclosing中搜寻,比如嵌套函数中更靠外侧的函数,如果还是没有,则搜索全局变量,如果还是没有,就搜索内建变量名,最终找不到的话,则抛出异常。当然,值得一提的是,如果定义了nonlocal,那么将不遵从LEGB法则。
今天要总结的重点是,虽然class 也提供local scope,但是它与函数进行嵌套时,不会产生enclosing的范围,即它嵌套的函数,实际上是class 的方法,不构成enclosing scope,其调用的变量需要通过instance,或者class 获取,但其与外层的def 构成enclosing scope,对外层的变量可以直接获取。下面上代码:
def generate():
class spam:
count=1
def method(self):
print(spam.count)
return spam()
这段代码中,method与class并不形成enclosing scope,获取count,只能通过spam。
如果method直接打印count,如下:
def generate():
class spam:
count=1
def method(self):
print(count)
return spam()
>>> generate().method()
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
generate().method()
File "<pyshell#14>", line 5, in method
print(count)
NameError: name 'count' is not defined
而当count位于两个def 之间时,就构成了enclosing scope,就可以直接调用获取,如下:
def generate():
count=1
class spam:
def method(self):
print(count)
return spam()
运行:
>>> generate().method()
1
python 变量搜寻顺序法则LEGB之E注意事项的更多相关文章
- Python 变量作用域 LEGB (上)—— Local,Global,Builtin
Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...
- Python 变量作用域 LEGB (下)—— Enclosing function locals
上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...
- 变量名解析:LEGB原则
# -*- coding: cp936 -*- #python 27 #xiaodeng #变量名解析:LEGB原则 ''' L-----local 局部名字空间 E-----enclosing 直接 ...
- Python——变量的作用域
原创声明:本文系博主原创文章,转载及引用请注明出处. 1. 在编程语言中,变量都有一定的作用域,用来限定其生命周期,且不同类型的变量作用域不同. 在Python中解释器引用变量的顺序(优先级)为:当前 ...
- Python - 变量的作用域
变量作用域 Python能够改变变量作用域的代码段是 def . class . lamda. if/elif/else.try/except/finally.for/while 并不能涉及变量作用域 ...
- Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
- Python变量类型
Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...
- Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习
#coding=utf-8 __author__ = 'Administrator' #Python变量类型 #Python数字,python支持四种不同的数据类型 int整型 long长整型 flo ...
- [Python]基础教程(4)、Python 变量类型
Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...
随机推荐
- Hive事务原理和Datax同步事务表问题解决
一.事务的概述 1.定义 事务就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位. 2.特点 事务(transaction)具有的四个要素:原子性(Atomicity).一 ...
- P1060 爱丁顿数
P1060 爱丁顿数 转跳点:
- jsp快速回顾
http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html http://blog.163.com/mount_lee/blog/st ...
- git下载安装、配置及idea初始化
安装 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.0.tar.gz git 安装依赖 yum -y insta ...
- 064、Java中递归调用
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Phoenix5.0的部署
官网下载编译好的二进制包 http://phoenix.apache.org/download.html2 上传并解压到指定目录, 再修改目录名称 tar -zxvf apache-phoenix-5 ...
- 创建一个TCP代理
代理技术 代理一般被我们用于"穿墙",具体来说可以看这里,或者查wiki.理解代理背后的原理之后,便很容易知道,代理的作用不仅仅只是"穿墙".例如我们可以把经过 ...
- Unity 脚本中的update,fixedupdate,lateupdate
先放着 有功儿夫再来整理 https://www.cnblogs.com/fly-100/p/3777731.html https://www.cnblogs.com/hont/p/5184802.h ...
- redis.conf文件配置
最重要三个配置 1. bind 127.0.0.1 需要注释掉这一行,使别的主机可以访问 2. daemonize no 需要改为yes,使其后台运行 3. requirepass foobared ...
- 十七、SAP中使用SQL语句读取一条数据
一.需要说明的是SAP不同类型的结构体类型之间是不能随意赋值的,如果需要赋值,可以使用CORRESPONDING FIELDS OF关键字, 不同类型结构体中同名的成员会被赋值,代码如下: 二.输出代 ...