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

閱讀時間約 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這個封閉的變數。

錯誤視窗

錯誤視窗


總結

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

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

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

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

全域變數比喻成姓名

區域變數比喻成綽號

封閉變數比喻成小名


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



avatar-img
128會員
213內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
在求學階段,你已經對代數的計算熟到不能再熟,所以變數(variable)對你來說應該不至於太陌生,先來看看以下這個例子:   
Thumbnail
本文將介紹 Python 中的閉包(Closure),我們將從閉包的定義開始介紹,然後是閉包的用途,以及最後的實作範例。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
在求學階段,你已經對代數的計算熟到不能再熟,所以變數(variable)對你來說應該不至於太陌生,先來看看以下這個例子:   
Thumbnail
本文將介紹 Python 中的閉包(Closure),我們將從閉包的定義開始介紹,然後是閉包的用途,以及最後的實作範例。