初識(shí)Python: global關(guān)鍵字
在讀這篇文章之前,確保你對(duì) Python 全局、本地和非本地變量 有一定的基礎(chǔ)。
global 關(guān)鍵字簡(jiǎn)介
在 Python 中,global 關(guān)鍵字允許你修改當(dāng)前范圍之外的變量。它用于創(chuàng)建全局變量并在本地上下文中更改變量。
global 關(guān)鍵字的規(guī)則
在 Python 中,有關(guān) global 關(guān)鍵字基本規(guī)則如下:
- 當(dāng)我們?cè)谝粋€(gè)函數(shù)中創(chuàng)建一個(gè)變量時(shí),默認(rèn)情況下它是本地變量。
- 當(dāng)我們?cè)谝粋€(gè)函數(shù)之外定義一個(gè)變量時(shí),默認(rèn)情況下它是全局變量。你不必使用
global關(guān)鍵字。 - 我們使用
global關(guān)鍵字在一個(gè)函數(shù)中來讀寫全局變量。 - 在一個(gè)函數(shù)外使用
global關(guān)鍵字沒有效果。
使用 global 關(guān)鍵字(含示例)
我們來舉個(gè)例子。
示例 1:從函數(shù)內(nèi)部訪問全局變量
c = 1 # 全局變量def add():print(c)add()
運(yùn)行程序,輸出為:
1
但是我們可能有一些場(chǎng)景需要從函數(shù)內(nèi)部修改全局變量。
示例 2:在函數(shù)內(nèi)部修改全局變量
c = 1 # 全局變量def add():c = c + 2 # 將 c 增加 2print(c)add()
運(yùn)行程序,輸出顯示錯(cuò)誤:
UnboundLocalError: local variable 'c' referenced before assignment
這是因?yàn)樵诤瘮?shù)中,我們只能訪問全局變量但是不能修改它。
解決的辦法是使用 global 關(guān)鍵字。
示例 3:使用 global 在函數(shù)中改變?nèi)肿兞?/h4>
c = 0 # global variable-
def add(): global c c = c + 2 # 將 c 增加 2 print("Inside add():", c)-
add()print("In main:", c)
c = 0 # global variabledef add():global cc = c + 2 # 將 c 增加 2print("Inside add():", c)add()print("In main:", c)
運(yùn)行程序,輸出為:
Inside add(): 2In main: 2
在上面的程序中,我們?cè)?add() 函數(shù)中定義了 c 將其作為全局關(guān)鍵字。
然后,我們給變量 c 增加 2,即 c = c + 2。之后,我們調(diào)用了 add() 函數(shù)。***,打印全局變量 c。
正如我們所看到的,在函數(shù)外的全局變量也發(fā)生了變化,c = 2。
Python 模塊中的全局變量
在 Python 中,我們創(chuàng)建一個(gè)單獨(dú)的模塊 config.py 來保存全局變量并在同一個(gè)程序中的 Python 模塊之間共享信息。
以下是如何通過 Python 模塊共享全局變量。
示例 4:在Python模塊中共享全局變量
創(chuàng)建 config.py 文件來存儲(chǔ)全局變量
a = 0b = "empty"
創(chuàng)建 update.py 文件來改變?nèi)肿兞?/p>
import configconfig.a = 10config.b = "alphabet"
創(chuàng)建 main.py 文件來測(cè)試其值的變化
import configimport updateprint(config.a)print(config.b)
運(yùn)行 main.py,輸出為:
10alphabet
在上面,我們創(chuàng)建了三個(gè)文件: config.py, update.py 和 main.py。
在 config.py 模塊中保存了全局變量 a 和 b。在 update.py 文件中,我們導(dǎo)入了 config.py 模塊并改變了 a 和 b 的值。同樣,在 main.py 文件,我們導(dǎo)入了 config.py 和 update.py 模塊。***,我們打印并測(cè)試全局變量的值,無(wú)論它們是否被改變。
在嵌套函數(shù)中的全局變量
以下是如何在嵌套函數(shù)中使用全局變量。
示例 5:在嵌套函數(shù)中使用全局變量
def foo():x = 20def bar():global xx = 25print("Before calling bar: ", x)print("Calling bar now")bar()print("After calling bar: ", x)foo()print("x in main : ", x)
輸出為:
Before calling bar: 20Calling bar nowAfter calling bar: 20x in main : 25
在上面的程序中,我們?cè)谝粋€(gè)嵌套函數(shù) bar() 中聲明了全局變量。在 foo() 函數(shù)中, 變量 x 沒有全局關(guān)鍵字的作用。
調(diào)用 bar() 之前和之后, 變量 x 取本地變量的值,即 x = 20。在 foo() 函數(shù)之外,變量 x 會(huì)取在函數(shù) bar() 中的值,即 x = 25。這是因?yàn)樵?bar() 中,我們對(duì) x 使用 global 關(guān)鍵字創(chuàng)建了一個(gè)全局變量(本地范圍)。
如果我們?cè)?bar() 函數(shù)內(nèi)進(jìn)行了任何修改,那么這些修改就會(huì)出現(xiàn)在本地范圍之外,即 foo()。
























