pcwu's TIL Notes


[Python] Python 變數範圍

變數範圍總是在指定值時建立。例如:

x = 10
y = 10
def b():
    x = 100
    print x
    print y

b() # 100 10
print x # 10

以這個例子來說就建立了2個不同的 x

取用變數時,也是從當時的範圍開始尋找,若沒有,才找尋外部範圍。所以 y 就會向外尋找。

Global

如果希望指定值的變數是全域範圍的話,則要使用 global

x = 10
def some():
    global x
    x = 20

print x # 10
some()
print x # 20

但下面這樣會出錯,因為 print(x) 是使用區域變數:

x = 10
def some():
    print(x)
    x = 20

some()

UnboundLocalError: local variable 'x' referenced before assignment

Nonlocal

那如果要使用上一層的變數的話,在Python 3中新增了nonlocal,可以指明變數並非區域變數,請依照函式(Local functon)、外包函式(Endosing function)、全域(Global)、內建(Builtin)的順序來尋找,即使是指定運算。例如:

x = 10
def outer():
   x = 100         # 這是在 outer() 函式範圍的 x
   def inner():
       nonlocal x
       x = 1000    # 改變的是 outer() 函式的 x
   inner()
   print(x)        # 1000
outer()
print(x)           # 10

Reference