众所周知,在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注意事项的更多相关文章

  1. Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释:L —— Local(function):函数内的名字空间E —— Enclosing function locals:外部嵌套函数的名字 ...

  2. Python 变量作用域 LEGB (下)—— Enclosing function locals

    上篇:Python 变量作用域 LEGB (上)—— Local,Global,Builtin https://www.cnblogs.com/yvivid/p/python_LEGB_1.html ...

  3. 变量名解析:LEGB原则

    # -*- coding: cp936 -*- #python 27 #xiaodeng #变量名解析:LEGB原则 ''' L-----local 局部名字空间 E-----enclosing 直接 ...

  4. Python——变量的作用域

    原创声明:本文系博主原创文章,转载及引用请注明出处. 1. 在编程语言中,变量都有一定的作用域,用来限定其生命周期,且不同类型的变量作用域不同. 在Python中解释器引用变量的顺序(优先级)为:当前 ...

  5. Python - 变量的作用域

    变量作用域 Python能够改变变量作用域的代码段是 def . class . lamda. if/elif/else.try/except/finally.for/while 并不能涉及变量作用域 ...

  6. Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  7. Python变量类型

    Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...

  8. Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习

    #coding=utf-8 __author__ = 'Administrator' #Python变量类型 #Python数字,python支持四种不同的数据类型 int整型 long长整型 flo ...

  9. [Python]基础教程(4)、Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

随机推荐

  1. 机器学习算法中的网格搜索GridSearch实现(以k-近邻算法参数寻最优为例)

    机器学习算法参数的网格搜索实现: //2019.08.031.scikitlearn库中调用网格搜索的方法为:Grid search,它的搜索方式比较统一简单,其对于算法批判的标准比较复杂,是一种复合 ...

  2. NO29 用户提权sudo配置文件详解实践--志行为审计

     用户提权sudo配置文件详解实践: 放到visudo里:  验证权限:

  3. Minikube安装

    参考 https://blog.csdn.net/liumiaocn/article/details/52041726?locationNum=4&fps=1 中文社区API http://d ...

  4. oracle 导出时报错EXP-00011:table不存在

    oracle11g,在用exp命令备份数据库时,如果表中没有数据报EXP-00011错误,对应的表不存在.这导致对应的空表无法备份. 原因:11g默认创建一个表时不分配segment,只有在插入数据时 ...

  5. DevOps - 优势

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  6. django-腾讯paas-appengine阅读

    1 重写View基类的dispatch函数 api/baseview.py 在一个post请求中,在header中,CONTENT_TYPE为application/json,然后在request.b ...

  7. 软件包管理:RPM包管理-yum在线管理

    CentOS 是免费的的 RedHat需要付费 1.IP地址配置 setup  #使用setup工具 (这种方式配置的永久有效 同时还可以配置掩码 网关等) 直接输入setup就会弹出(注意的是该命令 ...

  8. LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)

    题目: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修 ...

  9. django 中从外界借助多个网站时 static 的存放和整理

    在 模板之家中  前端页面直接上去抓取  可是遇到重复  或者 版本不统一  所以 在每个app下面建立自己的 stastic 在制作的html  页面上方 导入静态页面 {% load static ...

  10. .NET 一次读取几百条数据优化,从原来30分钟优化到30秒

    1.全部数据读取到内存, 不要使用string,而是使用stringbuilder,stringbuilder的效率非常高 2.添加到数据库 不要使用excute,而是使用事务,几百万条数据会请求数据 ...