当前位置: 首页 > news >正文

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

 

转载于:https://www.cnblogs.com/johnyang/p/10397565.html

相关文章:

  • 体积雾
  • Java线程池详解(一)
  • 穷人为什么穷?
  • 【bzoj4567】[Scoi2016]背单词
  • Python基础python是如何进行内存管理的
  • Scriptable Render Pipeline-Custom Pipeline
  • C面试题1
  • [虚树][lca][dfs] 洛谷 P3233 世界树
  • Python Mysql 批量导入数据问题
  • Scriptable Render Pipeline-Baked Shadows
  • Hive| ETL清洗 查询练习
  • Scriptable Render Pipeline-Level of Detail
  • 大气散射模型的推导过程
  • The Theory of Stencil Shadow Volumes
  • Git简介
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • HashMap剖析之内部结构
  • mysql 5.6 原生Online DDL解析
  • rabbitmq延迟消息示例
  • React as a UI Runtime(五、列表)
  • React-生命周期杂记
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue-cli在webpack的配置文件探究
  • Webpack 4x 之路 ( 四 )
  • webpack+react项目初体验——记录我的webpack环境配置
  • Zsh 开发指南(第十四篇 文件读写)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 第2章 网络文档
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 码农张的Bug人生 - 初来乍到
  • 消息队列系列二(IOT中消息队列的应用)
  • ionic异常记录
  • #、%和$符号在OGNL表达式中经常出现
  • #include<初见C语言之指针(5)>
  • ()、[]、{}、(())、[[]]命令替换
  • (2.2w字)前端单元测试之Jest详解篇
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)Linux网络编程入门
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net Core 中间件验签
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net经典笔试题
  • .NET使用存储过程实现对数据库的增删改查
  • .net中调用windows performance记录性能信息
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Bean, @Component, @Configuration简析
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ Linux ] git工具的基本使用(仓库的构建,提交)