1.函數作用域介紹
?
函數作用域
Python中函數作用域分為4種情況:
- L:local,局部作用域,即函數中定義的變量:
- E:enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的。
- G:global,全局變量,即模塊級別定義的變量,在模塊開始、函數外定義的變量。
- B:built-in,系統固定模塊里的變量,比如int,bytearray等。
搜索變量的優先級順序依次是:局部作用域 > 外層作用域 > 當前模塊中全局作用域 > python內置作用域,也就是
L > E > G > B
實例說明:
?
2.作用域產生
Python中,只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的,如下代碼:
- if 2 > 1 :
- x = 2
- print(x) #2
if并沒有引入一個新的作用域,x仍處在當前作用域中,后面代碼可以使用。
- def test():
- x = 2
- print(x) # NameError: name 'x' is not defined
def、class、lambda是可以引入新作用域的。
3.global關鍵字
當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了,當修改的變量是在全局作用域(global作用域)上的,就要使用global先聲明一下,代碼如下:
age = 22 def change_age() : global age # 聲明一個age全局變量 print( '修改前: %s',age) age = 24 print(' 修改后: %s', age ) change_age() # 修改前:22 #修改后 :24
4. nonlocal關鍵字
global關鍵字聲明的變量必須在全局作用域上,不能嵌套作用域上,當要修改嵌套作用域(enclosing作用域,外層非全局作用域)中的變量怎么辦呢,這時就需要nonlocal關鍵字了。
def outer(): count = 10 def inner(): nonlocal count print('修改前:%s',count) count = 20 print('修改后:%s ' ,count) inner() print(count) outer() #修改前:10 #修改后:20 #20
?
5.小結:
(1)變量查找順序:LEGB,作用域局部>外層作用域>當前模塊中的全局>python內置作用域;
(2)只有模塊、類、及函數才能引入新作用域;
(3)對于一個變量,內部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量;
(4)內部作用域要修改外部作用域變量的值時,全局變量要使用global關鍵字,嵌套作用域變量要使用nonlocal關鍵字,nonlocal是python3新增的關鍵字。