溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解python全局變量,局部變量和命名空間

發(fā)布時間:2021-12-30 13:32:54 來源:億速云 閱讀:115 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么理解python全局變量,局部變量和命名空間”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

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

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

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

簡單說一下:變量不必也不能以在 Java 或 C 等編程語言中聲明的方式聲明。Python 中的變量通過定義它們來隱式聲明,即第一次分配值到一個變量,這個變量被聲明并自動具有必須分配給它的對象的數(shù)據(jù)類型。

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

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

def  f ():  
    print ( s )  
s  =  “我愛夏天的巴黎!” 
f ()

輸出:

我愛夏天的巴黎!

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

def  f ():  
    s  =  "我愛倫敦!" 
    打印( s ) 
s  =  “我愛巴黎!”  
f ()
打印( s )

輸出:

我愛倫敦!
我愛巴黎!

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

def  f ():  
   print ( s ) 
   s  =  “我愛倫敦!” 
   打印( s )
s  =  “我愛巴黎!” 
f ()

輸出:

UnboundLocalError Traceback (最近一次調(diào)用最后一次)
<ipython-input-3-d7a23bc83c27> in <module>
5
6 s = “我愛巴黎!”
----> 7 f ( )
<ipython-input-3-d7a23bc83c27> in f ()
1 def f ( ) :
----> 2 print ( s )
3 s = “我
愛倫敦!” 4 打印( s )
5
UnboundLocalError:賦值前引用了局部變量“s”

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

def  f (): 
    global  s 
    print ( s ) 
    s  =  "只在春天,但倫敦也很棒!" 
    打印( s )

s  =  "我在巴黎找課程!"  
f ()
打印( s )

輸出:

我正在巴黎尋找課程!
只在春天,但倫敦也很棒!
只在春天,但倫敦也很棒!

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

def  f (): 
    s  =  "我在全球范圍內(nèi)不為人知"
    打印( s ) 
f ()
打印( s )

輸出:

我在全球不為人知
只在春天,但倫敦也很棒!

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

def  foo ( 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 )

輸出:

42 17 4 17
42 15 3 4

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

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

def  f (): 
    city  =  "Hamburg" 
    def  g (): 
        global  city 
        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)部定義的變量是局部變量,除非它明確標(biāo)記為全局變量。換句話說,我們可以在任何封閉作用域中引用一個變量名,但我們只能在局部作用域中通過賦值重新綁定變量名,或者通過使用全局聲明在模塊全局作用域中重新綁定變量名。我們還需要一種方法來訪問其他作用域的變量。這樣做的方法是非局部定義,我們將在下一章解釋。

非局部變量

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

def  f ():
    全球 城市
    打印( city )
city  =  "法蘭克福" 
f ()

輸出:

法蘭克福

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

def  f ():
    非本地 城市
    打印( city )
city  =  "法蘭克福" 
f ()

輸出:

文件“<ipython-input-9-97bb311dfb80>” ,第2
行 非本地城市
^
語法錯誤:未找到非本地“城市”的綁定

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

def  f (): 
    city  =  "Munich" 
    def  g (): 
        nonlocal  city 
        city  =  "Zurich" 
    print ( "調(diào)用前g:"  +  city ) 
    print ( "現(xiàn)在調(diào)用g:" ) 
    g () 
    print ( "調(diào)用后g: "  + 城市)
city  =  "Stuttgart" 
f () 
print ( "'city' in main:"  +  city )

輸出:

打電話之前 g: 慕尼黑
現(xiàn)在調(diào)用 g:
撥打 g 后:蘇黎世
主要的“城市”:斯圖加特

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

高清 ?F ():
    #city = “慕尼黑”
    高清 g ^ ():
        外地 市
        城市 =  “蘇黎世”
    打印(“呼叫摹前:”  + 城市)
    打?。ā傲⒓粗码奊:” )
    g ^ ()
    打印(“后呼叫 g: "  +  city )
city  =  "Stuttgart" 
f () 
print ( "'city' in main:"  +  city )

輸出:

文件“<ipython-input-11-5417be93b6a6>” ,第4
行 非本地城市
^
語法錯誤:未找到非本地“城市”的綁定

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

def  f (): 
    #city = "Munich" 
    def  g (): 
        global  city 
        city  =  "Zurich" 
    print ( "Before call g:"  +  city ) 
    print ( "Calling g now:" ) 
    g () 
    print ( "After 調(diào)用g:" )呼叫 g: " +  city )
city  =  "Stuttgart" 
f () 
print ( "'city' in main:"  +  city )

輸出:

打電話之前:斯圖加特
現(xiàn)在調(diào)用 g:
撥打 g 后:蘇黎世
主要的“城市”:蘇黎世

然而有一個巨大的不同:全局 x 的值現(xiàn)在發(fā)生了變化!

“怎么理解python全局變量,局部變量和命名空間”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI