python基础--函数作用域

# 在Python中,函数的变量并不是在什么地方都可以访问的,访问权限取决于这个变量是在哪里定义的。
# 变量的作用域决定了那一部分程序可以访问哪个特定的变量名称
# python的函数作用域一共有四种
# L (Local) 局部作用域
# E (Enclosing) 闭包函数外的函数中
# G (Global) 全局作用域
# B (Built-in) 内建作用域
# 俗称LEGB,查找顺序为:L—E—G—B,局部找不到,就去外边的函数找,
# 然后去寻找全局变量,最后去内建作用域中找。
num = 5
def printer():
    num = 6
    print(num) # 这时是局部作用域 6
printer()
# print(num) # 这时是外部作用域
# 函数内部可以用全局作用域,内建作用域,而在函数外不能用局部作用域
# 在函数内部可以用全局作用域,但是有下边一种情况
# num = 5
# def change_num():
#     num += 5
# change_num()
# 此时是报错的,因为python内部对变量的保护,防止变量的值莫名其妙的被改变。
# 若要在函数内部改变全局变量或者函数外部的函数变量是,需要用到两个关键字
# global :说明此时我们用的是全局变量
# nonlocal :说明我们此时用的是函数外函数的变量
# 在看上边的例子
num = 5
def chang_num():
    global num # 此时就可以修改全局变量了
    num += 5
    print(num)
chang_num()
# 当函数内部有变量num时,而且全局变量也有num时,如果我们要用全局变量,
# 那么该怎么办呢,具体答案是不能这样做,不能在局部变量存在的情况下引用全局变量
# 下边这个例子是报错的,具体可以自己自行体会。
# num = 5
# def chang_num():
#     num = 10
#     global num
#     print(num)
# chang_num()
# 由此类比  E (Enclosing)函数外的函数的作用域。 
def outer1():
    num = 10
    def inner():
        print(num) # 此时num为10

def outer2():
    num = 10
    def inner():
        # 如果我们要修改num的值,需要用到 nonlocal关键字
        nonlocal num
        num += 10
        print(num) # 此时num为20

 

你可能感兴趣的:(python基础--函数作用域)