Collect from 网页模板
Modified by 追梦人物

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 =  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