1.變數範圍
x = 10 # 全域變數
y = 10
def a():
x = 100 # 變數範圍是在指定value時才會建立,區域變數,跟全域變數的x是不同的
# 使用變數時,先從當前的範圍開始找,找不到才往外找
# 此區域變數在function結束時就被消滅
print(x)
print(y)
a() # 100 10
print(x) # 10,調用全域變數
2.global
x = 10
def a():
global x # 如果想修改全域變數,要加個global statement
x = 20 # 這樣就是修改全域變數了
print(x) # 10
a()
print(x) # 20
# 但下面這種會出錯,因為print(x)是使用區域變數!
x = 10
def a():
print(x)
x = 20
a()
3.nonlocal
# 在python3中新增加的功能
# 可以讓我們找到上一層的變數,順序是按LEGB來尋找,也就是函式(Local)、閉包(Enclosing function)、全域(Global)、內建(Builtin)的順序來尋找
x = 10
def outer():
x = 100 # 這是在 outer() 函式範圍的 x
def inner():
nonlocal x
x = 1000 # 改變的是 outer() 函式的 x,nonlocal會幫我們尋找到上一層的x,也就是x=100
inner()
print(x) # 1000,修改的是x=100
outer()
print(x) # 10