1. python作用域類型
1)函數中的局部作用域:local
2)嵌套函數中父級函數的局部作用域:enclosing
3)全局作用域:global
4)系統內置的變量:如 int、str、list 等關鍵字
變量的查找順序為:局部作用域 > 父級函數作用域 > 當前模塊全局作用域 > 系統內置作用域
2. 函數體內部對外部變量的引用
1)獲取變量
函數內部可直接獲取外部定義的變量
# 直接獲取變量,此時打印結果為:a = 0 a = 0 def func1(): print(a)
如下所示,函數內再定義一個重名的變量,會優先引用局部作用域內的變量,並不會引用到全局變量
# 函數內再聲明一個變量a,並賦值,此時函數內部打印的結果為:a = 1,函數外部打印的結果為:a = 0 a = 0 def func2(): a = 1 print(a) print(a)
2)修改全局變量
要想在函數內部對全局變量進行修改,需要使用 global 聲明函數體內的這個變量是全局變量
# 用global聲明這是一個全局變量,此時打印結果為:a = 1 a = 0 def func3(): global a a = 1 print(a)
3)修改父級函數定義的局部變量
先來看一個錯誤案例
# 這是一個裝飾器,可以簡單先理解為是一個嵌套函數,在父級函數中定義了變量 a,然后在最內層函數中修改 a 的值 def func_error(func): a = 5 def wrapper(): func() a = a + 1 print(a) return wrapper @func_error def error_demo(): pass error_demo()
執行后報錯:UnboundLocalError: local variable 'a' referenced before assignment
原因是在wrapper函數內,沒有找到局部變量 a,父級函數中定義的變量作用域只在父級函數的局部作用域
如果想要使用,則需要在wrapper內使用 nonlocal 來聲明這是一個外層非全局的變量