1
Local 一个函数定义了一个 local 作用域; PyFrameObject 中的 f_local 属性 2 Global 一个 module 定义了一个 global 作用域; PyFrameObject 中的 f_global 属性. 3 BuiltIn open, dir 的作用域等等, python 最顶层的作用域
4 Enclosing 5 例子, 6 b = 2 7 def funcO(): 8 b = 3 9 def funcI(): 10 print(b) 11 return funcI 12 13 f = funcO() 14 f() #1 15 16 Output, 17 3 #1 18 19 例子的输出结果是 '3' 而不是代码块儿最外层所定义的 'b = 2'. 20 f() 实际调用的内嵌在 funcO 中的 funcI 函数. funcI 位于 funcO 之内, 所以函数 funcI 的作用域内嵌于函数 funcO 的作用域内. 21 即, 函数 funcO 的作用域是内嵌函数 funcI 的'直接外围作用域', 所以例子的结果是 '3' 而不是 '2'. 22 单纯按照代码块儿的结构来说, 在 #1 处 'b = 3' 这个约束已经不再对 'f()' 这个调用起作用, 但是从打印的结果来看显然不是这样(依然起作用). 23 Python 虚拟机在执行 'f = funcO()' 的时候会执行 'def funcI():' (因为 函数 funcO return 了 funcI 函数对象), 24 就在这个时候 约束'b = 3' 与函数对象 funcI 捆绑了一起, 并把捆绑后的街哦过返回, 这个捆绑起来的整体被称为 '闭包'('捆绑' 一词可以理解为 '直接外围作用域' 的绑定过程). 25 闭包是 LEGB 规则中的 E -> enclosing 的首字母, 表示的是 '直接外围作用域' 这个概念. 26 27 global 关键字, 28 例子, 29 c = 1 30 def func1(): 31 print(c) 32 33 def func2(): 34 print(c) 35 c = 3 36 print(c) 37 38 func1() 39 func2() 40 41 Output, 42 1 # func1() 的打印 43 func2() # func2() 的打印 44 print(c) 45 UnboundLocalError: local variable 'c' referenced before assignment 46 47 func1 和 func2 同是对'直接外围作用域'的搜索, 为什么一个正确搜索约束 'c = 1',另一报错呢? 48 先来了解一个名字的定义 - '最内嵌套作用域规则'. 49 最内嵌套作用域规则:由一个赋值语句引进的名字在这个赋值语句所在的作用域里是可见(起作用)的, 50 而且在其内部嵌套的每个作用域里也可见,除非它被嵌套于内部的, 51 引进同样名字的另一条赋值语句所遮蔽/覆盖。 52 53 从 exception 中得知, 变量 c 没有被定义. 上述问题就出现在'定义'的后半句,‘除非’分句 - '除非它被嵌套于内部的, 54 引进同样名字的另一条赋值语句所遮蔽/覆盖。' 恰巧紧接着报错处, 通过赋值语句引进了一个同名约束('c = 3'),进而破坏了'最内嵌套作用域规则'. 55 56 现在尝试修改这个引用错误, 57 c = 1 58 def func1(): 59 print(c) #1 60 61 def func2(): 62 global c #2 在引用之前通过 global 关键字指定作用域 63 print(c) #2 64 c = 3 65 print(c) #3 66 67 func1() 68 func2() 69 print(c) #4 70 71 Output, 72 1 #1 73 1 #2 python 理解了编程者的意图 74 3 #3 75 3 #4 76 进一步再看一个闭包的例子, 77 d = 1 78 def func2(): 79 d = 3 80 def func2I(): 81 global d 82 print(d) #1 83 d += 4 #2 重写直接外层作用域 84 print(d) #2 85 return func2I 86 87 abc = func2() 88 abc() 89 print(d) #3 90 91 Output, 92 1 #1 global 关键字 打破 LEGB 规则, 限定引用直接外层作用于 93 5 #2 直接外层作用于被重写 94 5 #3 被重写的‘直接外作用域’(代码块儿最外层的 'd = 1' 这个约束)作用于 LEGB 规则下作用域
Python LEGB (Local, Enclosing, Global, Build in) 规则
转载于:https://www.cnblogs.com/zzyzz/p/7509486.html
相关文章:

图解DotNet框架系列
图解.Net框架系列(索引贴) (声明:本系列已完成,故索引帖重发) 众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文…

【Linux基础】文件处理实例
1.文件拆分 //每4000行拆分一个文件 split -l 4000 epms_t_ep_fx_stl_xy_20190129.dat 2.行处理 //查找第二列为711611且第三列为711100记录,打印行号和整行数据 awk -F ‘^C’ {if ($3711100 && $2711611) print NR,$0 } epms_t_ep_fx_stl_xy_20190229.d…

scala语言运行递归“分鱼”程序
A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 B 第二个醒来,也将鱼分…

smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。...
smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。function smarty_modifier_truncate($string, $length 80, $etc ..., $codeutf8, $mbtrue) { if ($length 0) return $string; if(function_exists("mb_subs…

java基础小总结(2)
Day07: 1.如果局部变量和全局变量都有相同的数据类型和变量名,先调用局部变量,实现就近原则; 2.匿名对象由于局限性的原因,一般只调用一次,且只是当作为实际参数传递的时候使用; 3.面向对象语言…

Wireshark实验HTTP
在 Wireshark 实验入门里,我们已经初步使用了 Wireshark 包嗅探器,我们现在可以操作 Wireshark 来查看网络协议。在这个实验中,我们会探索 HTTP 协议的几个方面:基本的 GET/response 交互,HTTP 消息格式,检…

2、安装ICS(Internet Component Suite)控件
下载完成后解压到你的指写目录!1、在library里加入ICS->Delphi->Vc32目录。2、从File->Open中打开ICS->Delphi->Vc32->IcsDel110.dproj文件。(文件名在其它Delphi版本略有不同)3、在项目管理器中,右键IcsDel110.bpl选择Build和Install…

定制CE系统随笔-续1
更改用户界面颜色[HKEY_LOCAL_MACHINE\SYSTEM\GWE] "SysColor"hex: 00,00,00,00, 3A,6E,A5,00, 00,00,00,00, 00,00,00,00,\ EF,EB,DE,00, FF,FF,FF,00, 00,00,00,00, 00,00,00,00,\ 00,00,00,00, FF,F…
安装包安全测试
主要说明以下内容:1、能否反编译代码2、安装包是否签名3、完整性校验4、权限设置检查反编译代码:移动应用发布出去后最终用户获得的是一个程序安装包,我们需要关注的是用户能否从这个安装包中获取项目的源代码,从安全方面考虑&…

Java课程寒假之开发记账本软件(网页版)之二
一.实现基础功能之一(记账) 一个记账本最基础之一的功能就是记账,所以也是首先要解决的问题,我选择了上学期使用的MySQL数据库来对账本进行存储。 我选择记账的方法是分开记账,就是支出放在一个表,收入放在…

谷歌浏览器Google Chrome和Adobe Flash Plugins插件安装问题
最近在做CSS的多浏览器支持,于是安装上了谷歌浏览器Google Chrome浏览器,结果发现谷歌浏览器Google Chrome的确构造非常简单,精干,速度非常迅猛,比臃肿的IE8快多了,于是开始使用谷歌浏览器Google Chrome&am…

Wireshark实验 - 入门
# Wireshark实验 - 入门 **官方英文文档:[Wireshark_Intro_v6.0.pdf](Wireshark_Intro_v6.0.pdf)** **以下内容为笔者翻译:** *** ## Wireshark 实验: 入门 v6.0 **《计算机网络:自顶向下方法(第6版)》补充材料&…

观察者模式的经典应用(猫叫 烧开水)
Code 猫叫了 老鼠跑 主人惊醒 1/**//* 2 * 题目: 3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程 4 * 1,老鼠跟主人是被动的 5 * 2,要考虑联动性与扩展性 6 */ 7using System; 8using Sys…

HTML学习笔记之基本介绍
超文本标记语言 (Hyper Text Markup Language,HTML)不是一种编程语言,而是一种标记语言,用一套标记标签描述网页 HTML 标记标签又被称为 HTML 标签(HTML Tag),它是由尖括号包围的关键词…

系统分析与设计 实验一用例模型
图书管理系统系统分析及用例图 图书管理系统能够为一定数量的借阅者提供服务。每个借阅者能够拥有唯一标识其存在的编号。图书馆向每一个借阅者发放图书证,图书证中包含每一个借阅者的编号和个人信息。系统通过一个单独的程序为借阅者提供服务,不需要管理…

2017.9.12.语文
列夫尼古拉耶维奇托尔斯泰(Лев Николаевич Толстой,1828年9月9日-1910年11月20日)19世纪中期俄国批判现实主义作家、思想家、哲学家。 转载于:https://www.cnblogs.com/mldyz/p/7510750.html

一封会笑死人的校园情书
Kiss郝美丽: Sorry!我把Miss拼成了Kiss,一不小心吻了你,实在是对不起! 吾本良家子弟,正统少年,一向对美眉们保持一种昂首挺胸,目不斜视的高姿态,人送美名…

Java面试题之多线程同步和互斥有几种实现方法,都是什么?
线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另外一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,每个线程访问时的排他性。当有若干个线程…

1)头结点,头指针,
http://blog.csdn.net/zhenyusoso/article/details/6092843 转载于:https://www.cnblogs.com/xiaoyoucai/p/7512001.html

软件测试实验--数据工厂DataFactory+MySQL数据构造
数据工厂---DataFactoryMySQL数据构造 显示成功,但测出来的是啥...

杀进程和取文件最近使用时间
unit uFTPclient; interface uses SysUtils,Windows,Tlhelp32; const FILE_CREATE_TIME0; //文件建立时间 FILE_MODIFY_TIME1; //修改时间 FILE_ACCESS_TIME2; //最后访问时间 type TFileTimes (ftLastAccess, ftLastWrite, ftCreation); //文件是否…

局域网常见问题
1.开启Guest用户 密码可以不设,这样可以只输入账号Guest,即可登录(互访)。但需要保证以下策略的开启。 点击“开始→运行”并输入“gpedit.msc”,打开组策略。依次点击“计算机配置→Windows设置→安全设置→本地策略→安全选项”,…

visual studio 2017 中默认无法开发 Android 8.0 及以上系统的解决方案
一般默认比较旧有两个原因,系统版本过旧,Visual Studio 版本过旧。 第一步,将windows 更新到最新版,必须是windows 10 并且更新到最新。 第二步,将visual studio -> 工具 -> 扩展和更新 ,安装完所有更…

软件测试--利用正交表设计测试用例
输入条件如下: 姓名:填、不填 性别:男、女 学历:小学、初中、高中、专科、本科、硕士、博士 等级:普通、VIP 用正交表设计测试用例 Allpairs安装及使用 输入数据时要用tab键,或者使用excel表格处理 测试用…

TensorFlow 实现分类操作的函数学习
函数:tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, nameNone) 说明:此函数是计算logits经过sigmod函数后的交叉熵值(即互熵损失),能帮助你更好的进行分类操作。对于一个不相互独立的离散分类任务&#x…

【推荐】极限编程的十二大原则——小版本
小版本:用最少的代码工作量带来最大的业务价值。 这个原则是意思是为了高度迭代,与客户展现开发的进展,小版本发布是一个可交流的好办法,客户可以针对性提出反馈。但小版本把模块缩得很小,会影响软件的整体思路连贯&am…

抓取网络文件的URL地址作附件发送
最近公司的一个项目, 把网站的前后台分离到两个不同的服务器上(后台Server在公司内部网,前台Server在互联网了).前后台用户(分别称呼:客户,公司员工)所有的上传的文件必须要存放在前台的Server上,这样客户才能无障碍访问文件.那,客户登陆前台提出咨询问题之后,公司员工回复问题…

字符串类型String总结
1.String类: ①Java中,字符串是String类的对象; ②Java中,String是引用数据类型; ③可以通过使用String类提供的方法来完成对字符串的操作; ④创建一个字符串对象之后,将不能更改构成字符串的字…

C# Task注意事项
1、在Task中调用主线程控件 Task.Factory.StartNew(() > {}).ContinueWith(task > {this.Invoke(new Action(() > { MessageBox.Show(this, "执行完成"); })); }); 转载于:https://www.cnblogs.com/zhyue93/p/task1.html

CSS实现网页图片预加载
#preloadedImages {width:0px;height:0px;display:inline;background-image:url(path/to/image1.png);background-image:url(path/to/image2.png);background-image:url(path/to/image3.png);background-image:url(path/to/image4.png);background-image:url();}只要在HTML里加…