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

发布于: 2020 年 07 月 16 日
Python的四种作用域及调用顺序

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

局部作用域#

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

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 = 1
myfun2 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 add
test = 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 = 1
b = 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 = 1
def 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)中查找,查找不到报错。

作者: Kristine。出处:https://www.cnblogs.com/wangxue574/p/12366748.html

用户头像

Young先生

关注

Python工程师/书虫/极客/ 2020.04.22 加入

伸手摘星,即使徒劳无功,也不至于满手泥污。 欢迎大家访问我的BigYoung小站(bigyoung.cn)

评论

发布
暂无评论
Python的四种作用域及调用顺序