Python 系列文章學習記錄:
Python系列之Windows環境安裝配置_開著拖拉機回家的博客-CSDN博客
Python系列之變量和運算符_開著拖拉機回家的博客-CSDN博客
Python系列之判斷和循環_開著拖拉機回家的博客-CSDN博客
Python系列之字符串和列表_開著拖拉機回家的博客-CSDN博客
Python系列之文件操作和函數_開著拖拉機回家的博客-CSDN博客
Python系列模塊之標準庫OS詳解_開著拖拉機回家的博客-CSDN博客
Python系列模塊之標準庫re詳解_開著拖拉機回家的博客-CSDN博客
Python系列模塊之標準庫json詳解_開著拖拉機回家的博客-CSDN博客
Python系列模塊之標準庫shutil詳解_開著拖拉機回家的博客-CSDN博客
Python系列模塊之pymysql操作MySQL 數據庫_開著拖拉機回家的博客-CSDN博客
Python系列之面向對象編程_python面向對象編程-CSDN博客
?Pythonpython系列之函數閉包概念_python閉包函數-CSDN博客
一、LEGB 規則
LEGB 規則是 Python 查找變量的順序,即當在代碼中引用一個變量時,Python 會按照以下順序在不同的作用域中查找該變量:
- Local(局部作用域):函數內部定義的變量和參數,只在函數內部可見。
- Enclosing(閉包作用域):嵌套函數中,內部函數可以訪問外部函數的局部變量,這些外部函數的局部變量所在的作用域就是閉包作用域。
- Global(全局作用域):在模塊級別定義的變量和函數,在整個模塊內都可以訪問。
- Built - in(內置作用域):Python 內置的函數和變量,如
print
、len
等,在任何地方都可以訪問。
二、作用域實例
2.1 局部作用域(Local)
局部作用域是指函數內部的作用域,函數內部定義的變量和參數只能在該函數內部訪問。
def test_function():# 局部變量local_variable = 10print(local_variable)test_function()
# 以下代碼會報錯,因為 local_variable 是局部變量,在函數外部無法訪問
# print(local_variable)
2.2 閉包作用域(Enclosing)
當一個函數嵌套在另一個函數內部,并且內部函數引用了外部函數的局部變量時,就形成了閉包。內部函數可以訪問外部函數的局部變量,即使外部函數已經執行完畢。
def outer_function():# 外部函數的局部變量enclosing_variable = 20def inner_function():# 內部函數可以訪問外部函數的局部變量print(enclosing_variable + 1)return inner_functionclosure = outer_function()
closure()
2.3 全局作用域(Global)
全局作用域是指在模塊級別定義的變量和函數,在整個模塊內都可以訪問。可以使用 global
關鍵字在函數內部修改全局變量。
# 全局變量
def modify_global():global global_variable # 申明修改全局變量global_variable = 50 # 函數內部修改全局變量return global_variableprint(global_variable)
print(modify_global())
2.4 內置作用域(Built - in)
內置作用域包含了 Python 內置的函數和變量,如 print
、len
、int
等,這些函數和變量在任何地方都可以直接使用。
# 使用內置函數 len
my_list = [1, 2, 3]
length = len(my_list)
print(length)
2.5 作用域的嵌套和查找順序
當在代碼中引用一個變量時,Python 會按照 LEGB 規則從內到外依次查找該變量。如果在局部作用域中找到了該變量,則使用該變量;如果沒有找到,則繼續在閉包作用域中查找,以此類推。
# 全局變量
x = 10def outer():# 閉包作用域變量x = 20def inner():# 局部變量x = 30print(x) # 輸出 30inner()print(x) # 輸出 20outer()
print(x) # 輸出 10
- 在上述代碼中,
inner
函數內部的print(x)
會先在局部作用域中查找x
,找到局部變量x = 30
并輸出; outer
函數內部的print(x)
會在閉包作用域中查找x
,輸出閉包作用域變量x = 20
;
- 最后,在全局作用域中調用
print(x)
會輸出全局變量x = 10
。