[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
131會員
218內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
Tesseract 是一個開源的光學字符識別 (OCR) 引擎,可通過自定義訓練來改進對特定字體或語言的識別。 以下是一份基於 tesstrain 工具,並針對 Windows CMD 的完整 Tesseract 5 訓練教學。將利用官方提供的ocrd-testset.zip來做示範 前置
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
讀取ini配置文件時如果某個參數不存在,它就會報錯,要怎麼避免呢? 可以使用fallback 參數來指定預設值。 這樣即使配置文件中缺少一些參數,我們的程序也能正常運行並使用預設值。 讓我們來假設一個案例做說明: 先故意將先前範例的port的資料刪掉。
Thumbnail
INI 檔案是一種配置檔案格式,常用於保存設定資料和組態資訊。 它使用簡單的鍵值對結構來組織資料,通常用於程式、應用程式或操作系統中的配置和初始化設定。 INI 檔案每個鍵值對包含一個名稱(鍵)和對應的值。 基本的檔案格式如下: [Section1] Key1 = Value1 Key2 =
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。
Thumbnail
/ 大家現在出門買東西還會帶錢包嗎 鴨鴨發現自己好像快一個禮拜沒帶錢包出門 還是可以天天買滿買好回家(? 因此為了記錄手機消費跟各種紅利優惠 鴨鴨都會特別注意銀行的App好不好用! 像是介面設計就是會很在意的地方 很多銀行通常會為了要滿足不同客群 會推出很多App讓使用者下載 每次
Thumbnail
Tesseract 是一個開源的光學字符識別 (OCR) 引擎,可通過自定義訓練來改進對特定字體或語言的識別。 以下是一份基於 tesstrain 工具,並針對 Windows CMD 的完整 Tesseract 5 訓練教學。將利用官方提供的ocrd-testset.zip來做示範 前置
Thumbnail
這篇內容,將會講解什麼是變數,以及與變數相關的知識。包括變數、資料型態、變數賦值、變數的命名規則、變數的作用區域、變數的可重複性、內建變數。
就是指變數可以被訪問和使用的範圍,來說一下var、let和const的作用域差異。 var :function example() { console.log(x); // 輸出: undefined 因為變量提升造成的 var x = 5; } 函數作用域或全域作用域 可以重複宣告
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在Python中,我們可以用def關鍵字定義函數,並透過函數名稱呼叫它。函數參數可以是必填、關鍵字、默認或不定長度的類型。return語句負責結束函數並回傳值。全域變數可以在整個程序中使用,而區域變數只能在特定函數內使用。我們還可以在一個文件中定義函數,然後在另一個文件中呼叫它。
NumPy(Numeric Python)是Python中用於科學計算的核心庫之一。它提供了高性能的多維陣列對象(即ndarray)以及用於處理這些陣列的各種函數和工具。 在NumPy中,有幾個常用的指令可以用來創建陣列
Thumbnail
本文詳細介紹了Python中的各種資料型別,包括整數、字串、清單、元組、集合和字典,並提供了相關的操作範例。此外,還解釋了如何在Python中定義和操作變數,包括如何同時對多個變數進行賦值。
Thumbnail
讀取ini配置文件時如果某個參數不存在,它就會報錯,要怎麼避免呢? 可以使用fallback 參數來指定預設值。 這樣即使配置文件中缺少一些參數,我們的程序也能正常運行並使用預設值。 讓我們來假設一個案例做說明: 先故意將先前範例的port的資料刪掉。
Thumbnail
INI 檔案是一種配置檔案格式,常用於保存設定資料和組態資訊。 它使用簡單的鍵值對結構來組織資料,通常用於程式、應用程式或操作系統中的配置和初始化設定。 INI 檔案每個鍵值對包含一個名稱(鍵)和對應的值。 基本的檔案格式如下: [Section1] Key1 = Value1 Key2 =
Thumbnail
本文將介紹自定函式及應用,利用程式範例解釋為什麼要用到自定函式 自定函式好處當然就是,讓你的程式碼看起來比較簡潔,在重複使用到的程式碼區塊,可以包裝成函式,讓你重複使用它。