變數作用域(scope)在python中是乙個容易掉坑的地方。
什麼是作用域
作用域簡單說就是乙個變數的命名空間。**中變數被賦值的位置,就決定了哪些範圍的物件可以訪問這個變數,這個範圍就是命名空間。python賦值時生成了變數名,當然作用域也包括在內。
python的作用域一共有4中,分別是:
l (local) 區域性作用域
e (enclosing) 閉包函式外的函式中
g (global) 全域性作用域
b (built-in) 內建作用域
以 l --> e --> g -->b 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會去全域性找,再者去內建中找。
python除了def/class/lambda 外,其他如: if/elif/else/ try/except for/while並不能改變其作用域。定義在他們之內的變數,外部還是可以訪問。
理解全域性變數和區域性變數
1.定義的函式內部的變數名如果是第一次出現, 且在=符號前,那麼就可以認為是被定義為區域性變數。在這種情況下,不論全域性變數中是否用到該變數名,函式中使用的都是區域性變數。例如:
num = 100
def func():
num = 123
print num
func()
#輸出結果是123。說明函式中定義的變數名num是乙個區域性變數,覆蓋全域性變數。
再例如:
num = 100
def func():
num += 100
print num
func()
#輸出結果是:unboundlocalerror: local variable 'num' referenced before assignment。提示錯誤:區域性變數num在賦值前被應用。
#也就是說該變數沒有定義就被錯誤使用。由此再次證明這裡定義的是乙個區域性變數,而不是全域性變數。
2.函式內部的變數名如果是第一次出現,且出現在=符號後面,且在之前已被定義為全域性變數,則這裡將引用全域性變數。例如:
num = 100
def func():
x = num + 100
print x
func()
#輸出結果是200。
def func():
x = num + 100
print x
func()
#輸出結果是:nameerror: global name 'num' is not defined。
3.函式中使用某個變數時,如果該變數名既有全域性變數也有區域性變數,則預設使用區域性變數。例如:
num = 100
def func():
num = 200
x = num + 100
prinx x
func()
#輸出結果是300。
4.在函式中將某個變數定義為全域性變數時需要使用關鍵字global。例如:
num = 100
def func():
global num
num = 200
print num
func()
print num
#輸出結果分別是200和200。這說明函式中的變數名num被定義為全域性變數,並被賦值為200。
再例如:
num = 100
def func():
global num
num = 200
num += 100
print num
func()
print num
#輸出結果分別是300和300。
Python 變數作用域
g global defchange global g g g change print g change print g 結果 global globalchange def function g function deflocalvar g local defglobalvar global g...
變數作用域 python
python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 以 l e g b 的規則查詢,即 在區域性找不到,便會去區域性外的區域性找 例如閉包 再找不到就會去全...
Python變數作用域
python 中,程式的變數並不是在哪個位置都可以訪問的,訪問許可權決定於這個變數是在 賦值的。變數的作用域決定了在哪一部分程式可以訪問哪個特定的變數名稱。python的作用域一共有4種,分別是 l local 區域性作用域 e enclosing 閉包函式外的函式中 g global 全域性作用域...