Python中的全局變量和局部變量簡介

已發表: 2021-08-26

Python 以一種非常特立獨行的方式處理變量。 雖然許多編程語言默認將變量視為全局變量(除非聲明為局部變量),但 Python 將變量視為局部變量,除非反過來聲明。 Python默認將變量視為局部變量的驅動原因是使用全局變量通常被認為是糟糕的編碼習慣。

因此,在 Python 中編程時,當變量定義發生在函數中時,默認情況下它們是本地的。 您在函數體中對此變量所做的任何修改或操作都將僅保留在此函數的範圍內。 或者,換句話說,這些變化不會反映在函數之外的任何其他變量中,即使該變量與函數的變量同名。 所有變量都存在於定義它們的函數範圍內並保存該值。 要獲得 Python 變量和項目的實踐經驗,請嘗試我們從美國最好的大學獲得的數據科學認證。

通過本文,讓我們探討 Python 中局部變量和全局變量的概念,以及如何定義全局變量。 我們還將看一些被稱為“非局部變量”的東西。

繼續閱讀!

目錄

Python 中的全局變量和局部變量

讓我們看一個示例來了解如何在 Python 中的函數體內使用全局值:

程序:

定義函數():

打印(字符串)

string = “我愛 Python!”

函數()

輸出

我愛蟒蛇!

如您所見,變量字符串的值是“我愛 Python!” 在調用 func() 之前。 函數體只包含 print 語句。 由於函數體內沒有對字符串變量進行賦值,因此它將取而代之的是全局變量的值。

結果,輸出將是變量字符串的全局值,在這種情況下,是“我愛 Python!”。

現在,讓我們更改 func() 中字符串的值,看看它如何影響全局變量:

程序:

定義函數():

string = “我愛 Java!”

打印(字符串)

string = “我愛 Python!”

函數()

打印(字符串)

輸出:

我愛Java!

我愛蟒蛇!

在上面的程序中,我們定義了一個函數 func(),在其中,我們有一個變量字符串,其值為“I love Java!”。 所以,這個變量是函數 func() 的局部變量。 然後,我們像之前一樣擁有全局變量,然後我們調用函數和 print 語句。 首先,函數被觸發,調用該函數的 print 語句並傳遞輸出“我愛 Java!” – 這是該函數的局部變量。 然後,一旦程序超出了函數的範圍,s 的值就會變為“I love Python”,這就是我們將這兩行都作為輸出的原因。

現在,讓我們添加前兩個示例,並嘗試使用 print 語句訪問字符串,然後嘗試為其分配一個新值。 本質上,我們試圖創建一個字符串作為局部變量和全局變量。

幸運的是,Python 不允許這種混淆並引發錯誤。 這是如何做:

程序:

定義函數():

打印(字符串)

string = “我愛 Java!”

打印(字符串)

string = “我愛 Python!”

函數()

輸出(錯誤):

———————————————————————————

UnboundLocalError Traceback(最近一次調用最後一次)

<模塊>中的<ipython-input-3-d7a23bc83c27>

5

6 字符串 = “我愛 Python!”

——> 7 函數()

<ipython-input-3-d7a23bc83c27> 在 func()

1個定義函數():

—> 2 打印(字符串)

3 字符串 = “我愛 Java!”

4 打印(字符串)

5

UnboundLocalError:分配前引用的局部變量's'

顯然,Python 不允許變量在函數內部既是全局變量又是局部變量。 因此,它為我們提供了一個局部變量,因為我們在 func() 中為字符串賦值。 結果,第一個打印語句顯示錯誤通知。 在任何函數範圍內創建或更改的所有變量都是局部變量,除非它們已明確聲明為“全局”。

在 Python 中定義全局變量

需要 global 關鍵字來通知 Python 我們正在訪問全局變量。 這是如何做:

程序:

定義函數():

全局字符串

打印(字符串)

string = “但我也想學 Python!”

打印(字符串)

string = “我正在學習 Java!”

函數()

打印(字符串)

輸出:

我正在尋找學習Java!

但我也想學習Python!

但我也想學習Python!

從輸出中可以看出,Python 識別出這裡的全局變量並相應地評估 print 語句,給出適當的輸出。

在嵌套函數中使用全局變量

現在,讓我們看看如果在嵌套函數中使用全局變量會發生什麼。 查看此示例,其中定義了變量“語言”並在各種範圍內使用:

程序:

定義函數():

語言 = “英語”

定義函數1():

全球語言

語言 = “西班牙語”

print(“調用 func1 之前:” + 語言)

print("現在調用 func1:")

函數1()

print("調用 func1 後:" + 語言)

函數()

print("main 中語言的值:" + 語言)

輸出:

調用 func1 之前:英文

現在調用 func1:

調用func1後:英文

主要語言的價值:西班牙語

如您所見,在嵌套的 func1 中使用 global 關鍵字時,對父函數的變量“語言”沒有影響。 即,該值被保留為“English”。 這也表明在調用 func() 之後,模塊命名空間中存在一個變量“language”,其值為“Spanish”。

這一發現也與我們在上一節中發現的一致——一個變量,當在函數體中定義時,除非另有說明,否則總是局部的。 但是,也應該有一種機制來訪問屬於不同其他範圍的變量。

這就是非局部變量的用武之地!

非局部變量

非局部變量是 Python3 引入的一種新鮮變量。 這些與全局變量有很多共同點,也非常重要。 但是,非局部變量和全局變量之間的一個區別是,非局部變量無法從模塊範圍內更改變量。

查看以下示例以了解這一點:

程序:

定義函數():

全球語言

打印(語言)

語言 = “德語”

函數()

輸出:

德語

正如預期的那樣,程序返回“Frankfurt”作為輸出。 現在,讓我們將“全局”更改為“非本地”,看看會發生什麼:

程序:

定義函數():

非本地語言

打印(語言)

語言 = “德語”

函數()

輸出:

文件“<ipython-input-9-97bb311dfb80>”,第 2 行

非本地語言

^

SyntaxError:找不到非本地“語言”的綁定

如您所見,上面的程序拋出了一個語法錯誤。 從這裡我們可以理解,非局部賦值只能通過嵌套函數的定義來完成。 非局部變量應該在函數的範圍內定義,如果不是這樣,它也無法在嵌套範圍內找到它的定義。 現在,查看以下程序:

程序:

定義函數():

語言 = “英語”

定義函數1():

非本地語言

語言 = “德語”

print(“調用 func1 之前:” + 語言)

print("現在調用 func1:")

函數1()

print("調用 func1 後:" + 語言)

語言 = “西班牙語”

函數()

print(“'語言' in main: ” + 語言)

輸出:

調用 func1 之前:英文

現在調用 func1:

調用 func1 後:德語

主要的“語言”:西班牙語

上述程序有效,因為變量“語言”是在調用 func1() 之前定義的。 如果未定義,我們將收到如下錯誤:

程序:

定義函數():

#language = “英語”

定義函數1():

非本地語言

語言 = “德語”

print(“調用 func1 之前:” + 語言)

print("現在調用 func1:")

函數1()

print("調用 func1 後:" + 語言)

語言 = “西班牙語”

函數()

print(“'語言' in main: ” + 語言)

輸出:

文件“<ipython-input-11-5417be93b6a6>”,第 4 行

非本地語言

^

SyntaxError:找不到非本地“語言”的綁定

但是,如果我們將 nonlocal 替換為 global,該程序將正常工作:

程序:

定義函數():

#language = “英語”

定義函數1():

全球語言

語言 = “德語”

print("在調用 func1` 之前:" + 語言)

print("現在調用 func1:")

函數1()

print("調用 func1 後:" + 語言)

語言 = “西班牙語”

函數()

print(“'語言' in main: ” + 語言)

輸出:

調用 func1 之前:英文

現在調用 func1:

調用 func1 後:德語

主要的“語言”:德語

如果您注意到,全局變量(語言)的值也在上述程序中發生了變化! 這就是非局部變量帶來的力量!

綜上所述

在本文中,我們討論了 Python 中的局部變量、全局變量和非局部變量,以及您應該注意的不同用例和可能的錯誤。 有了這些知識,您就可以繼續練習不同類型的變量並註意細微的差異。

Python 是一種在全球範圍內非常流行的編程語言——尤其是在解決與數據相關的問題和挑戰方面。 在 upGrad,我們在 85 多個國家/地區擁有學習者基礎,在全球擁有 40,000 多名付費學習者,我們的計劃影響了超過 500,000 名在職專業人士。 我們的數據科學和機器學習課程旨在幫助任何背景的積極進取的學生開始他們的旅程並在數據科學領域取得優異成績。 我們的 360 度職業幫助確保一旦您加入我們,您的職業生涯只會向上發展。 立即聯繫我們,體驗同行學習和全球網絡的力量!

Python中的變量有哪些類型?

根據它們的作用域,Python 中的變量可以是局部的、全局的或非局部的。

可以從函數內部訪問 Python 中的全局變量嗎?

是的,可以從 Python 中的函數內部訪問全局變量。

局部變量和全局變量有什麼區別?

全局變量將整個程序作為其作用域,而局部變量僅將定義它們的函數作為其作用域。