python函数变量的作用域_学不会的Python函数——变量作用域

1. LEGB函数

Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。我们先来看一段代码。

上述代码有两个变量a,当在test函数中输出变量a的值是,为什么输出的是20,而不是10呢?其实是因为变量作用域不同导致的。

变量的作用于决定了在那一部分程序可以访问哪个特定的变量名称。Python的作用于一共有以下四种。L(Local):函数内的区域,包括局部变量和形参。

E(Enclosing):外面嵌套函数区域,常见的是闭包函数外的函数。

G(Global):全局作用域。

B(Bulit-in):内建作用域。

Python中变量采用L->E->G->B的规则查找,即Python检索变量的时候,显示在局部中查找,如果找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,在者去内建中找。

2. 全局变量和局部变量

变量的作用域始终是Python学习中一个必须理解掌握的环节,下面我们从局部变量和全局变量开始全面解析Python中变量的作用域。

所谓局部变量,指的是在定义在函数内的变量。即定义在def函数内的变量名,只能在def函数内使用,它与函数外具有相同的名称的其他变量没有任何关系。不同的函数可以定义相同名字的局部变量,并且各个函数内的变量不会产生影响。

def test1():

num = 100

print("test1中的num值为%d" %num)

def test2():

num = 200

print("test2中的num值为%d" %num)

test1()

test2()

运行结果:

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量是定义在函数外的变量,它拥有全局作用域。

result = 100#定义一个全局变量,整个代码内调用

def sum(a,b):

result = a + b#定义一个局部变量,在函数内部调用

print("函数内的result的值为:",result)

#函数的返回值,result在这里是局部变量

return result

#调用函数后,打印返回值显示局部变量

sum(100,200)

#直接调用全局变量,跟函数没关系

print("函数外的result是全局变量,等于",result)

运行结果:

3. global和nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

3.1 global关键字

global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。

上述程序报错,提示”在赋值前引用了局部变量a“。但是,前面我们明明是可以在函数中访问全局变量的啊。而这里为什么会出错呢?

这就是Python与其他语言不同之处了。在Python中,如果在函数内部对全局变量a进行修改,Python会把变量a当作是局部变量,而在进行”a += 100“之前,我们是没有声明局部变量a的,因此,程序会出现上述错误提示。

为了使全局变量生效,我们可以在函数内使用global关键字进行声明。

这下,程序不但没有报错,而且成功对全局变量进行了修改。

3.2 nonlocal关键字

nonlocal是在Python3.0中新增的关键字。使用nonlocal关键字可以在一个嵌套的函数中修改嵌套作用域中的变量。

上面的程序中,在嵌套的func_in函数中,对变量count赋值,同时会创建一个新的变量,而非使用count = 1语句中的count,如果要修改嵌套作用域中的count,就要使用nonlocal关键字了。

上述代码中,在func_in()函数中使用了nonlocal关键字,就会告诉Python在func函数中使用嵌套作用域中的变量count,因此对变量count进行修改时,会直接影响到嵌套作用域中的count变量,程序最后也就输出12了。

注意:使用global关键字进行修饰的变量之前可以不存在,而使用nonlocal关键字进行修饰的变量在嵌套作用域中必须已经存在。

Python其实没有那么难。

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

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

相关文章

浅谈JSP表单中的form传值

不同JSP页面之间、不同action之间,以及JSP中form与其对应的action之间,JSP中form与其不对应的action之间如何传值。本文将介绍JSP表单中的form传值。 JSP表单中的form传值 页面间链接和数据传递的三种方式 (1)通过JSP表单form将数据提交到下一个页面&…

react.js从入门到精通(一)

web端三大框架react、vue和angular,下面是对react.js的一些总结。 一、环境搭建 1、npm搭建项目 推荐使用npm搭建项目环境,如果网速过慢,可是使用cnpm进行项目的搭建(cnpm是淘宝的npm镜像,与npm有些差异,有…

java 代码冲突检测_Java中常见的代码冲突

java 代码冲突检测在工作中,最近我对现有Java项目进行了代码清理。 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突。 因此,我想出了此类常见违规的清单,并与同行共享,以提高安全意识&#xff…

ubuntu 编译mysql_Ubuntu编译MySQL5

编译MySQL5源码提示 No curses/termcap library found,但安装curses termcap都提示已经安装。编译时加上路径即可解决,即./conf编译MySQL5源码提示 No curses/termcap library found,但安装curses termcap都提示已经安装。编译时加上路径即可…

WIN7下搭建FTP

步骤如下: 一、 二、 三、 四、 五、 六、 七、 八、 九、检验 注意:只有本机可以访问ftp,外部电脑无法访问ftp?可能是防火墙未关闭。

Android调用系统拍照裁剪和选图功能

最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照private fun openCamera() { //调用相机拍照// 创建File对象,用于存储拍照后的图片var outputImage File(externalCacheDir, "output_image.jpg")try {if (outputI…

忘记番石榴:5个Google库Java开发人员应该知道的

什么是最有用但未知的Google Java库? 如果我们在激烈的黑客马拉松中阻止某人并要求她命名一个受欢迎的Google Java库,那么答案可能就是Guava。 这也就不足为奇了,因为它的主要重点是提高开发人员的生产力。 但是其他Google图书馆呢&#xff…

VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...

我们来编译配置qt的mysql数据库驱动,首先看看官方文档的说明,如下How to Build the QMYSQL Plugin on WindowsYou need to get the MySQL installation files.RunSETUP.EXEand choose "Custom Install".Install the "Libs & Include …

JAVA知识学习——类的修饰符

Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类。修饰符之间的先后排列次序对类的性质没有任何影响。一,非访问修饰符。 1…

神秘的数组初始化_I / O神秘化

神秘的数组初始化由于对高度可扩展的服务器设计的所有炒作以及对Node.js的狂热,我一直想重点研究IO设计模式,直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究,我认为最好记下我遇到的东西,作为对我以及可能遇到这篇…

mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的,与MSSQL或者Oracle的存储过程相比,如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容…

hive 案例分析

转自 http://www.cnblogs.com/guanhao/p/5641675.html 1. 创建数据库,切换数据库 create database testdb2; use testdb2; 2. 创建管理表 create table emp( empno int, empname string, job string, mgr int, hiredate string, salary double, comm double, deptn…

BeanUtils包的使用

BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作。 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1) BeanUtils相关包 commons-beanutils-1.8.3.jar commons-beanutils-1.8.3-javadoc.jar commons-beanuti…

使用JMX作为Ganglia的现代替代品进行CLDB监视

有许多选项可用于监视MapR集群的性能和运行状况。 在本文中,我将介绍使用Java管理扩展(JMX)监视CLDB的鲜为人知的方法。 据最受尊敬的MapR数据工程师之一,Akihiko Kusanagi称,与使用Ganglia相比,使用JMX来…

python 多线程并发怎么还是顺序执行_python thread 并发且顺序运行示例

python怎么实现用多线程顺序执行python 的GIL规定每个时刻只能有一个线程访问python虚拟机,所以你要用python的多线程来做计算是很不合算的,但是对于IO密集型的应用,例如网络交互来说,自己把自己说服了,是一种理智的胜利;自己被自己感动了,是…

markdown pad激活

<iframe src"https://cn.calcuworld.com/%e5%8d%81%e5%85%ad%e8%bf%9b%e5%88%b6%e8%ae%a1%e7%ae%97%e5%99%a8?iframe1" width"100%" height"400"></iframe> ---恢复内容开始--- 注册码 Soar360live.com GBPduHjWfJU1mZqcPM3BikjYKF…

Java 文件上传组件 Apache Commons FileUpload 应用指南(二)——FileUpload如何工作?

在最初的 http 协议中&#xff0c;没有上传文件方面的功能。RFC1867&#xff08;"Form-based File Upload in HTML".&#xff09; 为 http 协议添加了这个功能。客户端的浏览器&#xff0c;如 Microsoft IE, Mozila, Opera 等&#xff0c;按照此规范将用 户指定的文件…

pytest单侧模块_入门汇总

Pytest简单介绍 &#xff08;pytest是python的一个测试框架&#xff0c;主要是用来进行一些小的测试&#xff09; 安装&#xff1a;pip install -U pytest查看是否安装成功&#xff1a;pytest --version运行&#xff1a;在当前文件所在目录下执行pytest&#xff0c;会寻找当前目…

pythonreshape函数三个参数_详解numpy.ndarray.reshape()函数的参数问题

我们知道numpy.ndarray.reshape()是用来改变numpy数组的形状的&#xff0c;但是它的参数会有一些特殊的用法&#xff0c;这里我们进一步说明一下。代码如下&#xff1a;import numpy as npclass Debug:def __init__(self):self.array1 np.ones(6)def mainProgram(self):print(…

javafx 和swing_集成JavaFX和Swing

javafx 和swing我刚刚完成了对使用Swing的应用程序组件的重写&#xff0c;现在正在使用JavaFX&#xff0c;最后得到了与更大的swing应用程序集成的JavaFX组件。 这是一个很大的应用程序&#xff0c;重写花了我一段时间&#xff0c;最后一切都很好&#xff0c;我很高兴自己做到了…