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其实没有那么难。

python函数变量的作用域_学不会的Python函数——变量作用域相关推荐

  1. python中get函数是什么意思_详解python中get函数的用法(附代码)_后端开发

    strncmp函数用法详解_后端开发 strncmp函数为字符串比较函数,其函数语法为"int strncmp ( const char * str1, const char * str2, ...

  2. python自动化测试 视频百度云_柠檬班python自动化测试开发课程

    柠檬班python自动化测试课程大纲 第1节_开学典礼 第2节_环境管理 第3节_编码规范 第4节_项目结构 第5节_元组和列表的原理和操作 第6节_字典和集合的原理和应用 第7节_推导式 第8节_迭 ...

  3. python函数做菜单_学不会的Python函数——函数小案例(名片管理器)

    名片管理器是一款生活实用类软件,用来协助管理手机中的所有名片.为了帮助大家在实际应用中学会选择使用四种类型的函数,接下来我们开发一个名片管理器.这个案例要求使用函数完成各种功能,并且根据键盘的输入来选 ...

  4. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

  5. python游戏小项目简单_[简单学Python] 通过一个小游戏完成Python入门[2]变量和赋值...

    变量和赋值 到这里,你已经成功地打印出了千寻的名字和卖身契.与此同时,千寻也成为了汤婆婆的工人,渐渐地,她忘记了自己是谁,遗失了自己"姓名"的信息. 那么,在信息纷繁的代码世界里, ...

  6. python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式

    1.生成器 生成器的本质是迭代器. 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 #函数 deffunc():prin ...

  7. python中 是什么类型_浅谈python中的变量默认是什么类型

    浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...

  8. python turtle 绘图速度用函数会快吗_有趣的Python turtle绘图

    专 题 Feature Story 16 \ China Science & Technology Education 文 _ 毛京宇/北京师范大学第三附属中学 魏云靖/北京市师达中学 有趣的 ...

  9. python函数模块关键代码_从零开始学Python(六):函数,模块和类的使用

    从这章开始,我们不在使用sublime文本编译器进行编码了,主要是我们每次运行的使用还得去命令行执行pyhon ***.py命令查看结果,操作比较麻烦.推荐大家使用Pycharm(具体安装使用教程大家 ...

最新文章

  1. PHPStudy 安装 Imagick 报错:无法定位程序输入点 于动态链接库上
  2. SAP QM 稳定性研究功能研习系列1 - 稳定性研究总流程
  3. windows 默认使用python3_小白都能上手的Python3编程环境搭建 (Windows 10)
  4. 计算机if函数and,excel if_EXCEL函数IF()+()和IF(and)区别是什么?
  5. 面试官:为什么 HashMap 的加载因子是0.75?
  6. sublime使用正则匹配
  7. 【NOI2012】迷失游乐园【概率期望】【换根dp】【基环树】
  8. CodeBlocks问题解决
  9. python - 2 8 16进制/颜色/字符编码
  10. openstack搭建
  11. 特斯拉否认推出16万元电动车 近期全球多地曝召回
  12. 几段小代码解释Python命令式编程和函数式编程
  13. ActiveX控件dsoFramer的使用(word、excel、PPT)
  14. 离散数学主析取范式及主合取范式
  15. sucess - money - freedom
  16. ae制h5文字动画_绝对干货!H5动画制作方法全揭秘
  17. 崩坏3区号+86_手机号码前的“+86”是什么意思?
  18. 软件看门狗和硬件看门狗
  19. Debian 12采用 Ubuntu三重缓冲
  20. 试题 历届试题 青蛙跳杯子

热门文章

  1. 工业级光纤收发器的选用方法
  2. 工业级以太网交换机跟普通商用网络交换机有啥区别?
  3. POE供电交换机技术分析及工作过程详解
  4. android 年月日时分秒控件,Android 年月日时分秒时间选择器
  5. java jsonarray 追加_我们如何在Java中将JSONArray添加到JSONObject?
  6. Java多线程(7)--线程池创建线程
  7. centos安装llvm_Linux CentOS上编译并安装Clang教程
  8. java创建单线程计时器_我们如何在Java中实现计时器线程?
  9. python装饰器class_Python中的各种装饰器详解
  10. linux系统中如何安装qwt,linux下Qt开发环境中qwt库的安装与使用