在函數內定義的變量,在函數的 “局部作用域” 中;而在函數外定義的變量,在 “全局作用域” 中。
在程序啓動時,會創建一個全局作用域。當程序終止時,就會銷燬這個作用域,其內部保存的變量也會被一同銷燬。
一個函數被調用時,會創建一個局部作用域。當這個函數返回時,這個作用域就會被銷燬。
1 全局作用域內,不能使用局部變量
全局作用域內如果使用了局部變量,就會拋錯:
def cook():
dumplings = 3
cook()
print(dumplings)
運行結果:
NameError: name 'dumplings' is not defined
因爲 cook() 返回後,其局部作用域中的 dumplings 變量也被一同銷燬了,所以在全局作用域內無法訪問。
2 局部作用域內,不能使用其它局部作用域內的變量
def dumpling():
dumplings = 5
print('dumpling()=' + str(dumplings))
def cook():
dumplings = 3
dumpling()
print('cook()=' + str(dumplings))
cook()
運行結果:
dumpling()=5
cook()=3
cook() 中調用了 dumpling(),因此其同名的 dumplings 變量被重新定義了。也就是說,一個函數內定義的局部變量與其它函數內部定義的變量,是完全隔離的。
另外,這個示例也說明了:不同作用域中的變量,可以同名。但不建議這樣做,因爲變量名相同,我們不好跟蹤代碼。
3 局部作用域內,可以使用全局變量
def cook2():
print(dumplings)
dumplings = 3
cook2()
運行結果:
3
總的來說,作用域與變量遵守以下規則:
- 全局作用域中的代碼,無法使用局部作用域中定義的變量。
- 局部作用域可以使用局部作用域中的定義的變量。
- 一個函數局部作用域中,無法使用其它局部作用域中的變量。
- 變量如果分別定義在不同的作用域中,那麼可以同名(不建議這樣做)。