作用域又可以被稱為命名空間,指變量起作用的范圍。Python變量作用域可以分為四種,分別為局部作用域、嵌套作用域、全局作用域、內置作用域。
作用域 | 英文 | 簡寫 |
---|---|---|
局部作用域 | Local | L |
嵌套作用域 | Enclosed | E |
全局作用域 | Global | G |
內置作用域 | Built-in | B |
四種作用域中變量的調用順序采取“就近原則”,即為 LEGB
局部作用域
指某個函數內部的范圍。每次執行函數時都會創建的新命名空間,同一函數不同時間運行其作用域相互獨立,不同函數內部可以使用同一變量名。局部作用域內聲明的變量名在函數外也可以使用,程序運行過程中兩者互不干擾。
def myfun():
a = 0 # 局部變量
a += 1
print("myfun a = ", a)
def myfun2():
a = [1, 2, 3] # 局部變量
a = [i + 1 for i in a]
print("myfun2 a = ", a)
a = 'Hello Python' # 此處a為全局變量
myfun()
myfun2()
print("函數外 a = ", a)
輸出結果:
myfun a = 1
myfun2 a = [2, 3, 4]
函數外 a = Hello Python
嵌套作用域
嵌套一般是指一個函數嵌套另一個函數的情況,外層函數包含變量的作用范圍稱為嵌套作用域;
也可以指一個類中包含多個函數時的情況。
# 1.函數嵌套:
def myfun(i):
a = [1, 2, 3] # a 所在范圍為嵌套作用域
def add():
a.append(i)
return a
return add
test = myfun(4)
print(test())
輸出結果:[1, 2, 3, 4]
# 2.類中包含多個函數
class test:
b = 1
def __init__(self):
self.a = 0
def myfun2(self):
self.a += 1
print("a = ", self.a)
self.b += 1
print("b = ", self.b)
test = test()
test.myfun2()
輸出結果:
a = 1
b = 2
全局作用域
全局作用域范圍指的是在一個.py文件內部,在模塊頂部聲明即可成為全局作用域。
全局作用域中的變量在函數中一般是不可更改的,例如整數,字符等,但對於列表和字典來說可以更改。如想引用並改變全局變量,可使用global關鍵字。
# 整數,字符串等不可更改
a = 1 # a為全局變量
def myfun():
a = 2 # 局部變量
a += 1
print("函數中 a = ", a)
myfun()
print("函數外 a = ", a)
輸出結果:
函數中 a = 3
函數外 a = 1
# 列表,元組等可更改
a = [1, 2, 3]
b = {'語文': 98, "數學": 101}
def myfun():
a.append(4)
b.update({"英語": 103})
print("函數中 a = ", a)
print("函數中 b = ", b)
myfun()
print("函數外 a = ", a)
print("函數外 b = ", b)
輸出結果:
函數中 a = [1, 2, 3, 4]
函數中 b = {'語文': 98, '數學': 101, '英語': 103}
函數外 a = [1, 2, 3, 4]
函數外 b = {'語文': 98, '數學': 101, '英語': 103}
# 利用global關鍵字 引用全局變量
a = 1
def myfun():
global a # 使用a之前用global
a += 1
print("函數中 a = ", a)
myfun()
print("函數外 a = ", a)
輸出結果:
函數中 a = 2
函數外 a = 2
內置作用域
內置作用域是python事先定義的內置模塊,例如built-in 模塊內的變量,程序啟動之后由python虛擬機自動加載,在程序的任何地方都可以使用,例如print函數,隨着解釋器存在或消亡。
總結
python的四種所用域及其調用順序,當使用某一變量時,首先在函數內部進行搜索(局部作用域 L),搜索不到便到上層函數或類中進行查找(嵌套作用域 E),再查找不到便到更上層模塊中進行查找(全局作用域 G),還查找不到則進入預先定義的(內置作用域 B)中查找,查找不到報錯。
本人剛入門python的菜鳥一枚,如有錯誤還請各位不吝賜教,感謝。