Python的四种作用域及调用顺序

Stella981
• 阅读 771

↑ 关注 + 星标 ~ 从此不迷路,后台回复【礼包】送你Python自学资料

作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。

作用域

英文

简写

局部作用域

Local

L

嵌套作用域

Enclosed

E

全局作用域

Global

G

内置作用域

Built-in

B

四种作用域中变量的调用顺序采取“就近原则”,即为 LEGB

局部作用域#

指某个函数内部的范围。每次执行函数时都会创建的新命名空间,同一函数不同时间运行其作用域相互独立,不同函数内部可以使用同一变量名。局部作用域内声明的变量名在函数外也可以使用,程序运行过程中两者互不干扰。

Copy`def myfun():    a = 0  # 局部变量    a += 1    print("myfun a = ", a)def myfun2():    a = [1, 2, 3] # 局部变量    a = [i + 1 for i in a]    print("myfun2  a = ", a)a = 'Hello Python'  # 此处a为全局变量myfun()myfun2()print("函数外 a = ", a)输出结果:myfun a =  1myfun2  a =  [2, 3, 4]函数外 a =  Hello Python` 

嵌套作用域#

嵌套一般是指一个函数嵌套另一个函数的情况,外层函数包含变量的作用范围称为嵌套作用域;
也可以指一个类中包含多个函数时的情况。

Copy`# 1.函数嵌套:def myfun(i):    a = [1, 2, 3] #  a 所在范围为嵌套作用域    def add():        a.append(i)        return a    return addtest = myfun(4)print(test())输出结果:[1, 2, 3, 4]` 

Copy`# 2.类中包含多个函数class test:    b = 1    def __init__(self):        self.a = 0    def myfun2(self):        self.a += 1        print("a = ", self.a)        self.b += 1        print("b = ", self.b)test = test()test.myfun2()输出结果:a =  1b =  2` 

全局作用域#

全局作用域范围指的是在一个.py文件内部,在模块顶部声明即可成为全局作用域。
全局作用域中的变量在函数中一般是不可更改的,例如整数,字符等,但对于列表和字典来说可以更改。如想引用并改变全局变量,可使用global关键字。

Copy`# 整数,字符串等不可更改a = 1  # a为全局变量def myfun():    a = 2  # 局部变量    a += 1    print("函数中 a = ", a)myfun()print("函数外 a = ", a)输出结果:函数中 a =  3函数外 a =  1` 

Copy`# 列表,元组等可更改a = [1, 2, 3]b = {'语文': 98, "数学": 101}def myfun():    a.append(4)    b.update({"英语": 103})    print("函数中 a = ", a)    print("函数中 b = ", b)myfun()print("函数外 a = ", a)print("函数外 b = ", b)输出结果:函数中 a =  [1, 2, 3, 4]函数中 b =  {'语文': 98, '数学': 101, '英语': 103}函数外 a =  [1, 2, 3, 4]函数外 b =  {'语文': 98, '数学': 101, '英语': 103}` 

Copy`# 利用global关键字 引用全局变量a = 1def myfun():    global a  # 使用a之前用global    a += 1    print("函数中 a = ", a)myfun()print("函数外 a = ", a)输出结果:函数中 a =  2函数外 a =  2` 

内置作用域#

内置作用域是python事先定义的内置模块,例如built-in 模块内的变量,程序启动之后由python虚拟机自动加载,在程序的任何地方都可以使用,例如print函数,随着解释器存在或消亡。

总结

python的四种所用域及其调用顺序,当使用某一变量时,首先在函数内部进行搜索(局部作用域 L),搜索不到便到上层函数或类中进行查找(嵌套作用域 E),再查找不到便到更上层模块中进行查找(全局作用域 G),还查找不到则进入预先定义的(内置作用域 B)中查找,查找不到报错。

Python的四种作用域及调用顺序

作者: Kristine 出处:

https://www.cnblogs.com/wangxue574/p/12366748.html

免费福利

1

给大家发个福利吧,不要钱的那种~~~

2

追剧,还在付费去广告吗?来试试免费的吧~

3

极客卸载,还你干净电脑

猜你喜欢

1. Django 配置JWT认证方式

2.  Django ORM 查询表中某列字段值

  1. Django中的session的使用

Python的四种作用域及调用顺序

喜欢就点个在看再走吧 Python的四种作用域及调用顺序

本文分享自微信公众号 - BigYoung小站(bigyoungs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Dax Dax
3年前
JS核心原理理解闭包
前置概念在正式看闭包之前,我们先来学习一下前置知识,那就是JS中的作用域,我们知道,在ES5之中,作用域分为两种:全局作用域和函数作用域,随着ES6的到来,新增了块级作用域,想更好的理解闭包,那么搞清楚作用域是首要条件全局作用域我们知道,对于变量而言,我们一般会分成两类:全局变量和局部变量,一般定义在最外围环境的为全局变量,定义在函数当中的为局部变量,在we
Symbol卢 Symbol卢
3年前
秒懂js作用域与作用域链
JavaScript中有一个被称为作用域(Scope)的特性。虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获!好了下面开始我们的正文作用域常见的解释(什么是作用域)1.一段程序代码中所用到的名字并不总是有效,而限定它的可用性的范围就是这个名字的作用域;2.作用域规定了
Karen110 Karen110
3年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
你所知道的JS变量作用域
变量的作用域,指的是变量在脚本代码中的可读、可写的有效范围,也就是脚本代码中可以使用这个变量的区域。在ES6之前,变量的作用域主要分为全局作用域、局部作用域(也称函数作用域)两种;在ES6及其之后,变量的作用域主要分为全局作用域、局部作用域、块级作用域这3种。相应作用域变量分别称为全局变量、局部变量、块级变量。全局变量声明在所有函数之外;局部变量是在函数体内
菜园前端 菜园前端
1年前
为你解惑JS作用域和作用域链知识
原文链接:变量作用域一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是可以访问的。然而在函数内声明的变量只能在函数体内访问,它们是局部变量,作用域是局部性的。函数参数也是局部变
Wesley13 Wesley13
3年前
JAVA记录
singleton作用域:当把一个Bean定义设置为singleton作用域是,SpringIoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。prototype作用域:protot
Wesley13 Wesley13
3年前
ES6 简单整理
1.变量声明let和constlet与const都是块级作用域,letfunctionname(){letage12;//age只在name()函数中存在}constconstname'tom'name'jack'//
小万哥 小万哥
1年前
Python 作用域:局部作用域、全局作用域和使用 global 关键字
变量只在创建它的区域内可用。这被称为作用域。局部作用域在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。示例:在函数内部创建的变量在该函数内部可用:pythondefmyfunc():x300print(x)myfunc()函数内部的函