Python的四種作用域


作用域又可以被稱為命名空間,指變量起作用的范圍。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的菜鳥一枚,如有錯誤還請各位不吝賜教,感謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM