Python作用域

Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置。与C语言有一些类似,与C语言比起来还有一些需要注意的地方。

现在的Python支持4种作用域,"LEGB"

  • L(local):局部作用域;
  • E(Enclosing): 闭包函数外的函数中;
  • G(Global):全局作用域;
  • B(Build-in):內建作用域;

在Python中只有模块函数会引入新的作用域,其他代码是不会引入新的作用域的
看下列C代码和Python代码

// C code
#include <stdio.h>
int main(){if(2>0)int i = 0printf("i = %d", i);return
}
# Python code
if True:i = 0
print(i)

上述代码中C代码编译会失败,而Python代码将成功运行。在上述Python代码中,if语句并没有引入一个新的作用域,变量i存在于全局作用域中,所以变量i对于接下来的print语句将是可见的。

在Python中使用一个变量之前不需要先对其进行声明,但真正使用它之前,这个变量必须被绑定到某个对象上,而且名字绑定将在当前作用域中引入新变量,同时屏蔽外层作用域的同名变量,不论这个名字绑定发生在当前作用域中的哪个位置。(下面代码 code3会体现)

# code 1
def f():print(i)
f()
# 运行结果 ==> NameError: global name 'i' is not defined
# code 2
i = 0
def f():i = 8print(i)
f()
print i
# 运行结果 ==>  8 和 0
# code 3
i = 0
def f():print(i)i = 0
f()# 运行结果 ==> UnboundLocalError: local variable 'i' referenced before assignment
# code 4
print(i)
i = 0
# 运行结果 ==> NameError: name 'i' is not defined
  • Python查找变量按照L->E->G->B的顺序的规则查找,在code 1中,在函数作用域中和全局作用域找不到i变量,所以报出global name not define
  • 由于函数作用域会屏蔽全局作用域,所以输出结果是8 和 0 而不是 8 和 8
  • code 3中显示的是UNboundLocalError (这是什么鬼>_>),另外code 4中无论是以交互方式运行还是脚本方式运行,都是显示NameError。综合这两个错误我们可以总结如下的结论。对函数体而言,Python在运行之前会对代码进行预处理,因此无论名称绑定发生在作用域的哪个地方,它都能感知出来,并且屏蔽全局作用域,但是对象绑定却是动态发生的,所以在code3处出现的是UNboundLocalError, 因为运行到 print(i)时 变量i仍未绑定到实际对象上。但是对于顶级作用域(模块作用域),却没有做任何预处理,所以出现的是name 'i' is not defined的错误。

转载于:https://www.cnblogs.com/pluviophile/p/7441711.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决flask端口被占用的问题

2019.04.11 实测&#xff1a; 只要停止程序&#xff0c;再运行&#xff0c;就可以了 问题提示&#xff1a;socket.error:[Errno 48] Address already in use 在编辑flask代码时&#xff0c;如果没有关闭flask的程序&#xff0c;默认的5000端口一直被占用。 再次运行的时候&am…

使用模板来解决接口继承问题

一.定义2个有继承关系的接口 struct IA {virtual void Test1()0; };struct IB:public IA {virtual void Test2()0; };二.定义2个类来实现 class A:public IA {virtual void Test1() {} };class B:public IB { public:virtual void Test2() {} };类B将无法使用,必须重新实现IA的…

python time模块详解

2019独角兽企业重金招聘Python工程师标准>>> python time模块详解 分类&#xff1a; python2009-03-28 23:35 89831人阅读 评论(9) 收藏 举报 pythonstructstringdstimportdate python 的内嵌time模板翻译及说明 一、简介 time模块提供各种操作时间的函数 说明&am…

单例写法 转

如何正确地写出单例模式 1.懒汉式&#xff0c;线程不安全 这段代码简单明了&#xff0c;而且使用了懒加载模式&#xff0c;但是却存在致命的问题。当有多个线程并行调用 getInstance() 的时候&#xff0c;就会创建多个实例。也就是说在多线程下不能正常工作 public class Singl…

【RK3399Pro学习笔记】十九、在ROS中点亮LED灯

目录创建ROS工作空间创建ROS功能包CSysFs方式&#xff08;需root&#xff09;源文件blink.cppgpiolib.cpp头文件gpiolib.hCMakeLists.txt运行代码调用shell命令方式&#xff08;无需root&#xff09;源文件blink.cppCMakeLists.txt运行代码平台&#xff1a;华硕 Thinker Edge R…

opencv中的Mat类型

Mat类型主要是跟matlab中的数据类型一样。故用起来很方便。 Mat最大的优势跟STL很相似&#xff0c;都是对内存进行动态的管理&#xff0c;不需要之前用户手动的管理内存&#xff0c;对于一些大型的开发&#xff0c;有时候投入的lpImage内存管理的时间甚至比关注算法实现的时间还…

C/C++与内存相关的函数

C语言的标准函数库与内存管理有关的函数从功能上分为两类:一类是系统对内存操作的函数,例如,读内存的函数、写内存函数,如从指定地址向内存写一个字节,一个字或向内存读一个字节或一个字操作;另一类是供用户动态使用内存的函数,例如,分配C程序一块存储区,并将该区清零函数; 1.动…

flask jinja2 如何遍历新闻列表

NEWS_DICT [{"newstitle": "新闻1", "url": "newsurl1"},{"newstitle": "新闻2", "url": "newsurl2"},{"newstitle": "新闻3", "url": "newsurl3"…

hihocoder [Offer收割]编程练习赛24

比赛https://hihocoder.com/contest/offers24/problems 应该能拿到个鼠标垫 舒服了 这个oj体验好差&#xff0c;每次都要先因为选错语言CE一发&#xff0c;而且刷新之后还是默认GCC A ⼩Hi的钟表 算秒数&#xff0c;算角度&#xff0c;注意180以内&#xff0c;所以大于180之后拿…

LaTex bib引用知网论文NoteExpress格式文献 —— cnki2bib

目录先决条件安装使用最后…棘手的用法简单用法获取NoteExpress格式到剪贴板将剪贴板内容转换在LaTex中使用调用格式效果TeXstudio 4.2.3 Windows 10 20H2 以下内容引自Python cnki2bib包介绍 先决条件 Python3 安装 pip install cnki2bibWinR打开cmd使用以上命令安装 使…

测试配置yum仓库的http镜像

测试配置yum仓库的http镜像一、基础环境 1、在tvm-base的基础上&#xff0c;复制一个镜像为tvm-yum来测试。 2、网络&#xff1a; eth0&#xff1a;host-only&#xff08;用于虚拟内网&#xff0c;手动固定IP&#xff0c;这样从宿主机可以直接连接到这个vm&#xff09; eth1&am…

24. 设计原则

总的来说是高内聚低耦合&#xff0c;内聚是把变化点进行封装&#xff0c;耦合还是要有的&#xff0c;只是要尽量少&#xff0c;不同内聚点的联系方式有两种&#xff0c;一种就是继承&#xff0c;一种就是组合。组合又分为基于接口组合还是基于类组合&#xff0c;基于接口就可以…

js中 json详解

var aa {name:"zoumm",age:23};var bb JSON.stringify(aa);console.log(bb); //打印出{"name":"zoumm","age":23} json的语法可以表示以下三种类型的值。 1、简单值&#xff1a;可以在json中表示字符串、数值、布尔和null。 2、对…

纸张大小

A0到A10的纸张尺寸表 纸的型号高(mm)x宽&#xff08;mm&#xff09;毫米高(mm)x宽(mm)英寸4A02378 x 1682 mm93.6 x 66.2 in2A01682 x 1189 mm66.2 x 46.8 inA01189 x 841 mm46.8 x 33.1 inA1841 x 594 mm33.1 x 23.4 inA2594 x 420 mm23.4 x 16.5 inA3420 x 297 mm16.5 x 11.7…

试用合肥工业大学学位论文 LaTeX 模板(HFUT_Thesis)

目录编辑器模板下载TeXstudio 4.2.3 Windows 10 20H2 编辑器 编辑器的下载和安装参考Latex下载 —— 倔强菜鸟(转载) 模板下载 见合肥工业大学硕士毕业论文的LaTex模板? 感谢大佬~ 大佬的项目地址&#xff1a;https://github.com/HFUTTUG/HFUT_Thesis/releases 下载下来后…

[CareerCup] 1.1 Unique Characters of a String 字符串中不同的字符

1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structure? 这道题让我们判断一个字符串中是否有重复的字符&#xff0c;要求不用特殊的数据结构&#xff0c;这里应该是指哈希表之类的不让用。像普…

怎么查询局域网内全部电脑IP和mac地址..

在局域网内查询在线主机的IP一般比较简单&#xff0c;但局域网内全部电脑的IP怎么才能够查到呢&#xff1f;查询到IP后我还要知道对方的一些详细信息&#xff08;如MAC地址、电脑名称等&#xff09;该怎么查询呢&#xff1f;&#xff1f;&#xff1f; 工具/原料 Windows 网络 方…

python flask 通过ajax向后台传递数组参数

https://blog.csdn.net/m0_38061194/article/details/78851152 ajax 像后台传递参数&#xff0c;一般是字典的形式传递&#xff0c;但是如果字典的value的值是一个数组的话&#xff0c;通过request.form 获取得到的结果是 None。这是就需要把数组对象转化为json字符串&#xf…

JS,JQuery杂谈

JS返回页面&#xff1a; JS返回前一个页面&#xff0c;经常看到有人用window.history.go(-1)这种方法 这种放的确可以返回&#xff0c;也仅仅只是返回&#xff0c;返回的页面信息却没有刷新。也有人用windows.history.back()&#xff0c;但是经常返回的时候会丢失页面&#xf…

C语言一阶低通、高通滤波器滤除截止频率外的杂波

目录理论推导产生测试信号sin_cal.csin_cal.h生成波形一阶滤波器FirstOrderFilter.cFirstOrderFilter.h测试低通滤波器高通滤波器IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 串口示波器&#xff1a;Vofa 1.3.10 理论推导 低通滤波器 …