[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這個封閉的變數。

錯誤視窗

錯誤視窗


總結

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

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

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

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

全域變數比喻成姓名

區域變數比喻成綽號

封閉變數比喻成小名


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



119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上篇文章中,我們學會了如何串接各個平台,並且簡單做出了一個會模仿我們說話的機器人,接下來我們將會從LINE Bot有哪些基本的回訊息功能來介紹起,而今天就先從推播以及回覆開始說起吧!!
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上篇文章中,我們學會了如何串接各個平台,並且簡單做出了一個會模仿我們說話的機器人,接下來我們將會從LINE Bot有哪些基本的回訊息功能來介紹起,而今天就先從推播以及回覆開始說起吧!!
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!