這篇文章主要介紹了關於Python中的函數作用域,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
在python中,一個函數就是一個作用域。這篇文章重點介紹給大家介紹python中的函數作用域,有興趣的朋友一起看看吧
在python中,一個函數就是一個作用域
name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:',name) change_name() # 调用函数 print("在外面的name:",name)
運行結果如下:
在change_name裡的name: 蕭亞飛
在外面的name: xiaoyafei
我們再試一下在巢狀函數中是如何的尋找的?
age = 15 def func(): print('第一层age:',age) # 第一层age: 15 def func2(): age = 73 print("func2中的age:",age) # func2中的age: 73 def func3(): age = 84 print("func3中的age:",age) # func3中的age: 84 func3() # 调用func3函数 func2() # 调用func2函数 func()
在以上巢狀函數中,就能夠很好的說明一個函數就是一個作用域,那麼我們現在稍微改一下程式碼看看情況?
age = 15 def func(): print('第一层age:',age) # 第一层age: 15 def func2(): print("func2中的age:",age) # func2中的age: 15 # 看到没有,如果当前作用域里没有age变量,那么它就会往上找 def func3(): age = 84 print("func3中的age:",age) # func3中的age: 84 func3() # 调用func3函数 func2() # 调用func2函数 func()
那麼,這時候有人就說了,屁話一大堆講的原來是局部變數和全域變數,那麼我想問:在上面這個嵌套函數中,func2中並沒有age變數,那麼它是如何找到全域變數age = 15的?
此時我們就需要來看一下作用域的尋找順序了:
#變數作用域LEGB
L:locals 函數內的名稱空間,包含局部變數與實參
E:enclosing 外部巢狀函數的名稱空間,即相鄰的上一層,打個比方說:func2中沒有age變數則會去func裡找這個
#G:globals 全域變數
B: builtins 內建模組的名稱空間
咳嗽,還是先了解下什麼是名稱空間把?
名稱空間,又名name space ,顧名思義就是存放名字的地方,存什麼名字呢?舉例說明,x = 1 ,1存放在內存當中,那麼變數名x存放在哪裡呢?名稱空間就是存放名字x與1綁定關係的地方
>>> x = 1 >>> id(1) 1576430608
名稱空間分為以下3種:
locals: 是函數內的名稱空間,包括局部變數和形參
globals: 全域變量,函數定義所在模組的名字空間
builtins: 內建模組的名字空間
不同變數的作用域不同就是有這個變數所在的命名空間決定的.
作用域即範圍
全域範圍:全域存活,全域有效
局部範圍:暫存,局部有效
讓我們來舉例看一下
level = 'L0' n = 22 def func(): level = 'L1' n = 33 print(locals()) # {'n': 33, 'level': 'L1'} 在之前说过在python中,一个函数就是一个作用域,这就很完美的体现了 def outer(): n = 44 level = 'L2' print(locals(),n) # {'level': 'L2', 'n': 44} 44 def inner(): level = 'L3' print(locals(),n) # {'level': 'L3', 'n': 44} 44 inner() outer() func()
以L --> E --> G -->B 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內置函數中找。
相關推薦:
以上是Python中的函數作用域的詳細內容。更多資訊請關注PHP中文網其他相關文章!