變量的做用域決定了在哪一部分程序能夠訪問哪一個特定的變量名稱,Python的做用域一共有4中
a、L(Local)局部做用域
b、E(Enclosing)閉包函數外的函數中
c、G(Global)全局做用域
e、B(Built-in)內建做用域
以 L--> E --> G --> B 的規則查找,即,在局部找不到,便回去局部外找(如閉包),再找不到就會去全局找,再者去內建中找
x = int(2.9) #內建做用域
g_count = 0 #全局做用域
def outer():
o_count = 1 #閉包函數外的函數中
def inner():
i_count = 2 #局部做用域
Python 中只有模塊(module),類(class)以及函數(def、lambda)纔會引入新的做用域,其餘的代碼塊(如 if/elif/try/except/for/while等)都不會引入新的做用域,也就說這些語句內定義的變量,外部也能夠訪問
a、定義在函數內容的變量擁有一個局部做用域,定義在函數外的擁有全局的做用域
b、局部比那裏只能在被聲明的函數內部訪問,而全局變量能夠在整個程序範圍內訪問,調用函數時,全部在函數內聲明的變量名稱都將被加入到做用域中。
total = 0 #全局變量
def sum(arg1,arg2):
total = arg1 + arg2 #total在這裏是局部變量
print ("函數內的局部變量",total)
return total
sum(10,20)
print ("函數外是全局變量",total)
#輸出
函數內是局部變量 : 30
函數外是全局變量 : 0
當內部做用域想修改外部做用域的變量時,就可用到 global 和 nonlocal 關鍵字
num = 1
def fun1():
global num #須要使用 global 關鍵字聲明
print (num)
num = 123
print (num)
fun1()
#輸出
1
123
若是要修改嵌套做用域(enclosing 做用域 ,外層非全局做用域)中的變量則須要 nonlocal 關鍵字
def outer():
num = 10
def inner():
nonlocal num #nonlocal關鍵字聲明
num =100
print(num)
inner()
print(num)
outer()
#輸出
100
100
錯誤的案例
a = 10
def test():
a = a + 1
print(a)
test()
#輸出報錯
# UnboundLocalError: local variable 'a' referenced before assignment
#錯誤信息爲局部做用域引用錯誤,由於 test 函數中的 a 使用的是局部,未定義,沒法修改
#想引用則 可用global 聲明
a = 10
def test():
global a #使用global 聲明
a = a + 1
print(a)
test()