深入了解python全局變量,局部變量和命名空間_第1頁
深入了解python全局變量,局部變量和命名空間_第2頁
深入了解python全局變量,局部變量和命名空間_第3頁
深入了解python全局變量,局部變量和命名空間_第4頁
深入了解python全局變量,局部變量和命名空間_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第深入了解python全局變量,局部變量和命名空間目錄函數(shù)中的全局和局部變量嵌套函數(shù)中的全局變量非局部變量Python使用全局和局部變量的方式是特立獨行的。雖然在許多或大多數(shù)其他編程語言中,如果未另行聲明,變量將被視為全局變量,而Python則以相反的方式處理變量。如果沒有另外聲明,它們是本地的。這種方法背后的驅(qū)動原因是全局變量通常是不好的做法,應(yīng)該避免。在大多數(shù)情況下,您想使用全局變量,最好使用參數(shù)將值放入函數(shù)或返回值以將其取出。與許多其他程序結(jié)構(gòu)一樣,Python也通過設(shè)計強加了良好的編程習慣。

因此,當您在函數(shù)定義中定義變量時,默認情況下它們是該函數(shù)的局部變量。也就是說,您對函數(shù)體中的此類變量所做的任何操作都不會影響函數(shù)外的其他變量,即使它們具有相同的名稱。換句話說,函數(shù)體是這樣一個變量的范圍,即這個名稱與其值相關(guān)聯(lián)的封閉上下文。

所有變量都有塊的作用域,它們在那里被聲明和定義。它們只能在聲明點之后使用。

簡單說一下:變量不必也不能以在Java或C等編程語言中聲明的方式聲明。Python中的變量通過定義它們來隱式聲明,即第一次分配值到一個變量,這個變量被聲明并自動具有必須分配給它的對象的數(shù)據(jù)類型。如果您在理解這一點時遇到問題,請參閱我們關(guān)于數(shù)據(jù)類型和變量的章節(jié),請參閱左側(cè)的鏈接。

函數(shù)中的全局和局部變量

在下面的示例中,我們想演示如何在函數(shù)體內(nèi)使用全局值:

deff():

print(s)

s=“我愛夏天的巴黎!”

f()

輸出:

我愛夏天的巴黎!

在調(diào)用函數(shù)f()之前,變量s被定義為字符串“我愛夏天的巴黎!”。f()的主體僅由“print(s)”語句組成。由于沒有局部變量s,即沒有賦值給s,將使用全局變量s的值。所以輸出將是字符串“我愛夏天的巴黎!”。問題是,如果我們在函數(shù)f()中改變s的值會發(fā)生什么?它也會影響全局變量嗎?我們在下面的一段代碼中對此進行了測試:

deff():

s="我愛倫敦!"

打印(s)

s=“我愛巴黎!”

打印(s)

輸出:

我愛倫敦!

我愛巴黎!

如果我們將第一個示例與第二個示例結(jié)合起來,即我們首先使用print()函數(shù)訪問s,希望獲得全局值,然后為其分配一個新值呢?給它賦值,意味著-正如我們之前所說的-創(chuàng)建一個局部變量s。因此,我們會將s作為同一范圍內(nèi)的全局變量和局部變量,即函數(shù)體。幸運的是,Python不允許這種歧義。因此,它會引發(fā)錯誤,正如我們在以下示例中所見:

deff():

print(s)

s=“我愛倫敦!”

打印(s)

s=“我愛巴黎!”

f()

輸出:

UnboundLocalErrorTraceback(最近一次調(diào)用最后一次)

ipython-input-3-d7a23bc83c27inmodule

5

6s=“我愛巴黎!”

----7f()

ipython-input-3-d7a23bc83c27inf()

1deff():

----2print(s)

3s=“我

愛倫敦!”4打印(s)

5

UnboundLocalError:賦值前引用了局部變量“s”

變量不能在函數(shù)內(nèi)既是局部的又是全局的。由于在f()內(nèi)部為s賦值,因此Python決定我們需要一個局部變量,因此在s定義之前的第一個打印語句拋出了上面的錯誤信息。任何在函數(shù)內(nèi)部更改或創(chuàng)建的變量都是局部變量,如果它沒有被聲明為全局變量。要告訴Python,我們要使用全局變量,我們必須使用關(guān)鍵字“global”明確說明這一點,如下例所示:

deff():

globals

print(s)

s="只在春天,但倫敦也很棒!"

打印(s)

s="我在巴黎找課程!"

打印(s)

輸出:

我正在巴黎尋找課程!

只在春天,但倫敦也很棒!

只在春天,但倫敦也很棒!

函數(shù)調(diào)用完成后,不能從外部訪問函數(shù)的局部變量。這是上一個例子的延續(xù):

deff():

s="我在全球范圍內(nèi)不為人知"

打印(s)

打印(s)

輸出:

我在全球不為人知

只在春天,但倫敦也很棒!

以下示例顯示了局部和全局變量以及函數(shù)參數(shù)的狂野組合:

deffoo(x,y):

全局a

a=42

x,y=y,x

b=33

b=17

c=100

打印(a,b,x,y)

a,b,x,y=1,15,3,4

foo(17,4)

打印(a,b,x,y)

輸出:

4217417

421534

嵌套函數(shù)中的全局變量

如果我們在嵌套函數(shù)中使用global關(guān)鍵字,我們現(xiàn)在將檢查會發(fā)生什么。以下示例顯示了在各種范圍內(nèi)使用變量“city”的情況:

deff():

city="Hamburg"

defg():

globalcity

city="Geneva"

print("調(diào)用前g:"+city)

print("現(xiàn)在調(diào)用g:")

g()

print("調(diào)用后g:"+城市)

f()

print("主城的值:"+city)

輸出:

之前打電話給g:漢堡

現(xiàn)在調(diào)用g:

打電話后g:漢堡

主要城市價值:日內(nèi)瓦

我們可以看到嵌套函數(shù)g中的global語句不會影響函數(shù)f的變量“city”,即它保持其值“Hamburg”。我們還可以從這個例子中推斷出,在調(diào)用f()之后,模塊命名空間中存在一個變量'city',其值為'Geneva'。這意味著嵌套函數(shù)中的global關(guān)鍵字不會影響其封閉命名空間的命名空間!這與我們在前一章中發(fā)現(xiàn)的一致:在函數(shù)內(nèi)部定義的變量是局部變量,除非它明確標記為全局變量。換句話說,我們可以在任何封閉作用域中引用一個變量名,但我們只能在局部作用域中通過賦值重新綁定變量名,或者通過使用全局聲明在模塊全局作用域中重新綁定變量名。我們還需要一種方法來訪問其他作用域的變量。這樣做的方法是非局部定義,我們將在下一章解釋。

非局部變量

Python3引入了非局部變量作為一種新的變量。非局部變量與全局變量有很多共同點。與全局變量的一個區(qū)別在于,無法通過使用非局部語句來更改模塊范圍內(nèi)的變量,即未在函數(shù)內(nèi)部定義的變量。我們在以下兩個示例中展示了這一點:

deff():

全球城市

打印(city)

city="法蘭克福"

f()

輸出:

法蘭克福

該程序是正確的,并返回“Frankfurt”作為輸出。我們將在以下程序中將“全局”更改為“非本地”:

deff():

非本地城市

打印(city)

city="法蘭克福"

f()

輸出:

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

行非本地城市

^

語法錯誤:未找到非本地“城市”的綁定

這表明非局部綁定只能在嵌套函數(shù)內(nèi)部使用。必須在封閉的函數(shù)作用域中定義非局部變量。如果變量未在封閉函數(shù)作用域中定義,則變量不能在嵌套作用域中定義。這是與“全局”語義的另一個區(qū)別。

deff():

city="Munich"

defg():

nonlocalcity

city="Zurich"

print("調(diào)用前g:"+city)

print("現(xiàn)在調(diào)用g:")

g()

print("調(diào)用后g:"+城市)

city="Stuttgart"

f()

print("'city'inmain:"+city)

輸出:

打電話之前g:慕尼黑

現(xiàn)在調(diào)用g:

撥打g后:蘇黎世

主要的“城市”:斯圖加特

在前面的例子中,變量'city'是在調(diào)用g之前定義的。如果沒有定義,我們會得到一個錯誤:

高清?F():

#city=“慕尼黑”

高清g^():

外地市

城市=“蘇黎世”

打?。ā昂艚心∏埃骸?城市)

打?。ā傲⒓粗码奊:”)

g^()

打?。ā昂蠛艚術(shù):"+city)

city="Stuttgart"

f()

print("'city'inmain:"+city)

輸出:

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

行非本地城市

^

語法錯誤:未找到非本地“城市”的綁定

該程序運行良好-如果我們將“非本地”更改為“全局”,在f-內(nèi)有或沒有'city="Munich"'行:

deff():

#city="Munich"

defg():

globalcity

city="Zurich"

print("Beforecallg:"+city)

print("Callingg

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論