def my_function():
local_variable = 10
def outer_function():
outer_variable = 20
def inner_function():
print(outer_variable)
global_variable = 42
def my_function():
print(global_variable)
# 在函式外部訪問全域變數
print(global_variable)
# 在函式內部訪問全域變數
my_function()
在此範例,我們先釐清在一段程式碼中,全域變數及區域變數的差異,若程式發開時訪問對於程式不存在的變數時就會產生error的出現。
# 全域變數
global_variable = 42
def my_function():
# 區域變數
local_variable = 10
# 在函式內部訪問全域變數
print("在函式內部訪問全域變數:", global_variable)
# 在函式內部訪問區域變數
print("在函式內部訪問區域變數:", local_variable)
# 在函式外部訪問全域變數
print("在函式外部訪問全域變數:", global_variable)
# 在函式外部訪問區域變數(會引發 NameError)
# print("Outside function - Local Variable:", local_variable)
# 呼叫函式
my_function()
# 修改全域變數的值
global_variable = 100
# 在修改後的函數外部再次訪問全域變數
print("在修改後的函數外部再次訪問全域變數:", global_variable)
在範例中print會在Console上輸出字串,有此範例可見全域變數在整段程式碼中都可以被拿出來做使用。
我們將上面的範例,將這段#拿掉,取消註解來試試看會出現什麼錯誤
# 在函式外部訪問區域變數(會引發 NameError)
print("Outside function - Local Variable:", local_variable)
在上圖呈現的,NameError: name 'local_variable' is not defined
就是代表local_variable
這個變數沒有被定義,所以無法做使用,這個變數並沒有昭告天下,所以眾所皆不知,只有函數自己知道。
內層函式inner_function()
可以訪問外層函式outer_function()
的變數inner_variable
但外層函式outer_function()
無法訪問內層函式的變數outer_variable
恩~有點繞口令,可以把內層函式想像成在家裡面你看的到外面的人,但外層函式是外面所以看不到裡面。
def outer_function():
# 外層函式的區域變數
outer_variable = 20
def inner_function():
# 內層函式的區域變數
inner_variable = 30
# 封閉變數:內層函式可以訪問外層函式的變數
print("Inner Function - Outer Variable:", outer_variable)
# 呼叫內層函式
inner_function()
# 在外層函數內訪問內層函數的區域變數(會引發 NameError)
# print("Outer Function - Inner Variable:", inner_variable)
# 呼叫外層函式
outer_function()
此範例跑的流程為,呼叫外層函式時,會先定義內層函式,然後跑到呼叫函式,則會印出外層函式的區域變數outer_variable
= 20
我們試著在外層函式訪問內層的變數看看,修改這段把註解拿掉。
# 在外層函式內訪問內層函數的區域變數(會引發 NameError)
print("Outer Function - Inner Variable:", inner_variable)
就會引發錯誤,在外層函式無法辨識inner_variable
這個封閉的變數。
全域變數,在哪裡都可以做使用
區域變數,可以在定義的函式內可以做使用,包括函式中的函式也可以
封閉變數,只有在定義的函式內可以做使用
用姓名來舉例說明,我的姓名就像全域變數一樣,大家都知道,區域變數就綽號一樣只有熟的人才會知道,小名就像封閉變數,只有家人才會知道,在不同關係中角色就不一樣,若是跟比較不熟的提起自己的小名,可能只有滿頭問號這小名指的是誰的概念套用到變數定義上。
全域變數比喻成姓名
區域變數比喻成綽號
封閉變數比喻成小名