# 在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