[Python基礎]理解變數作用域

2024/01/07閱讀時間約 6 分鐘

在Python中,有三種變數作用域:全域區域封閉

  1. 區域作用域(Local Scope):
    • 在函式內部定義的變數具有區域作用域,它們只能在該函式內部訪問。
    • 例如:
def my_function():
local_variable = 10
  1. 封閉作用域(Enclosing Scope):
    • 在巢狀函式結構中,內層函式可以訪問外層函式的變數,這些變數屬於封閉作用域。
    • 例如:
def outer_function():
outer_variable = 20
def inner_function():
print(outer_variable)
  1. 全域作用域(Global Scope):
    • 在整個程式中定義的變數擁有全域作用域,可以在程式的任何地方訪問。
    • 例如:
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這個封閉的變數。

錯誤視窗

錯誤視窗


總結

全域變數,在哪裡都可以做使用

區域變數,可以在定義的函式內可以做使用,包括函式中的函式也可以

封閉變數,只有在定義的函式內可以做使用

用姓名來舉例說明,我的姓名就像全域變數一樣,大家都知道,區域變數就綽號一樣只有熟的人才會知道,小名就像封閉變數,只有家人才會知道,在不同關係中角色就不一樣,若是跟比較不熟的提起自己的小名,可能只有滿頭問號這小名指的是誰的概念套用到變數定義上。

全域變數比喻成姓名

區域變數比喻成綽號

封閉變數比喻成小名


希望這樣解說,可以更明白其中的差異,謝謝大家觀看,若有問題或是需要改進的地方在留言讓我知道



49會員
86內容數
Python程式設計師,不是在學習就是在學習的路上
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容