Python中的global關(guān)鍵字,你了解嗎?
咪哥雜談

本篇閱讀時(shí)間約為 6 分鐘。
1
前言

疫情開(kāi)始的時(shí)候,年輕人重視,家長(zhǎng)不重視,現(xiàn)在反而反過(guò)來(lái)了,每天過(guò)多的疫情信息反而倒不讓我那么關(guān)注了。
現(xiàn)在到了收心的時(shí)候了,面對(duì)這樣的“黑天鵝事件”,我們應(yīng)該更多的把注意力放在提升于自身上,而非疫情資訊。
那么廢話不多說(shuō),今天來(lái)了解下 Python 中的 global 關(guān)鍵字。
2
Python變量的作用域
曾經(jīng)在閉包的文章 《python小課堂26 - 進(jìn)階必修之閉包(一)》中,我寫過(guò)一段關(guān)于作用域的介紹,復(fù)制下:
Python變量的作用域一共有4種,分別是:
- L (Local) 局部作用域
- E (Enclosing) 閉包函數(shù)外的函數(shù)中
- G (Global) 全局作用域
- B (Built-in) 內(nèi)建作用域
看完概念,接下來(lái)看看實(shí)例,請(qǐng)自行思考后再看答案。




實(shí)例一:
即使變量同名,優(yōu)先引用的是局部變量。
實(shí)例二 &?實(shí)例三:
閉包的情況,如果內(nèi)部函數(shù)沒(méi)有局部變量,則會(huì)優(yōu)先引用閉包的環(huán)境變量。
實(shí)例四:
3
global關(guān)鍵字
global warming:全球變暖。

上面的作用域四個(gè)案例如果看明白了,那我們繼續(xù)。
如果現(xiàn)在有個(gè)問(wèn)題是這樣的:
有個(gè)變量 x=5 ,現(xiàn)需要讓多個(gè)函數(shù)共享并且在函數(shù)內(nèi)引用它,請(qǐng)用代碼實(shí)現(xiàn)下。
有的小伙伴可能已經(jīng)想到,這題的答案不就是上面的實(shí)例四嗎?
在 func_a 和 func_b 函數(shù)中,你們看到外面的 x = 5 已經(jīng)作為全局變量在這兩個(gè)函數(shù)中分別成功打印。

對(duì)于全局變量來(lái)說(shuō),既然能函數(shù)體內(nèi)直接引用,并且程序沒(méi)有報(bào)錯(cuò),那為什么還要用 global 關(guān)鍵字?
別急,繼續(xù)往下看。
現(xiàn)在在重新聲明一個(gè) func_c 函數(shù),并且對(duì)這個(gè) x 進(jìn)行加 1 的操作。你覺(jué)得會(huì)打印什么結(jié)果?

在這個(gè)例子中設(shè)置的 x=5 屬于全局變量,而在函數(shù)內(nèi)部中沒(méi)有對(duì) x 的定義。
根據(jù) Python 訪問(wèn)局部變量和全局變量的規(guī)則:當(dāng)搜索一個(gè)變量的時(shí)候,Python 先從局部作用域開(kāi)始搜索,如果在局部作用域沒(méi)有找到那個(gè)變量,那樣 Python 就會(huì)像上面的案例中介紹的作用域范圍逐層尋找。
最終在全局變量中找這個(gè)變量,如果找不到則拋出 ?UnboundLocalError 異常。
但你會(huì)想,明明已經(jīng)在全局變量中找到同名變量了,怎么還是報(bào)錯(cuò)?
因?yàn)閮?nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對(duì)這個(gè)變量有修改的時(shí)候,此時(shí) Python 會(huì)認(rèn)為它是一個(gè)局部變量,而函數(shù)中并沒(méi)有 x 的定義和賦值,所以報(bào)錯(cuò)。
global 關(guān)鍵字為解決此問(wèn)題而生,在函數(shù) func_c中,顯示地告訴解釋器 x 為全局變量,然后會(huì)在函數(shù)外面尋找 x 的定義,執(zhí)行完 x = x + 1 后,x 依然是全局變量。

4
結(jié)語(yǔ)
好了,這就是本期的內(nèi)容,關(guān)于 global 的相關(guān)內(nèi)容,搞明白作用域,弄清同名變量賦值時(shí)的機(jī)制,在未來(lái)的編程道路中就不會(huì)出錯(cuò)啦。

如果你有什么想說(shuō)的,不懂得,歡迎評(píng)論區(qū)留言!~
你點(diǎn)的每個(gè)在看,我都認(rèn)真當(dāng)成了喜歡評(píng)論
圖片
表情
