介紹
了解Python函數中變量的名稱空間,範圍和行為對於有效編寫和避免運行時錯誤或異常至關重要。在本文中,我們將深入研究名稱空間和Python變量範圍的各個方面,並了解Python如何詳細管理本地,全局和封閉變量。
我們已經詳細討論了Python的功能,可以建立。 Python使用抽象原理隱藏複雜的邏輯並僅公開必要的輸出,而分解產生模塊化,可讀和可重複使用的功能。
這些原理足夠明顯,可以理解Python如何處理其可變範圍用於函數定義和嵌套功能,我們將通過詳細的示例探索。到本文結尾,您應該清楚地了解這些概念以及如何在程序中有效地應用它們。
概述
- Python的命名空間和可變範圍對於有效的預防編碼和誤差至關重要。
- 本文探討了python中的本地,全局和封閉變量的行為。
- LEGB規則描述了Python在不同範圍內的變量名稱搜索。
- 實際示例證明了全球和局部變量的使用和修改。
- 涵蓋了嵌套功能和封閉範圍,強調了非本地關鍵字。
目錄
- Python中有什麼變量?
- 全局變量
- 本地變量
- 命名空間是什麼?
- Python中有哪些可變範圍?
- LEGB規則是什麼?
- Python可變範圍如何?
- 1。在本地範圍中使用全局變量
- 2.在本地範圍中使用本地變量
- 3。修改本地範圍內的全局變量
- 4.使用聲明對本地範圍內部內部變量進行修改
- 5。使用功能修改全局變量inside本地範圍
- 什麼是嵌套功能?
- 變量的封閉範圍是什麼?
- 7.修改封閉範圍內無聲明的全局變量
- 8。使用聲明在本地範圍內修改嵌套變量
- 常見問題
Python中有什麼變量?
Python中的變量是存儲數據或值(例如INT,Float,Str,Bool等)的容器。存儲變量且也可以訪問的內存位置稱為變量的theScope。
Python中有兩種類型的變量,即:
全局變量
- 這些變量屬於主要程序的範圍。
- 主程序不能使用本地變量,因為它僅適用於函數。
本地變量
- 這些變量屬於功能範圍。
- 同樣,當未在本地範圍內定義本地變量時,本地變量可以使用函數內部的全局變量。
另請閱讀:Python中的可變與不變的物體
命名空間是什麼?
Python名稱空間是Aspace或字典,將標識符(通常稱為變量名稱)作為其鍵及其各自對像作為內存空間中的值。 Python編程語言具有44種類型的名稱空間,即:
- 內置名稱空間
- 全局名稱空間
- 封閉名稱空間
- 本地名稱空間
我們很快將研究不同的示例,以更好地理解這個概念。但是在此之前,了解上面提到的可變範圍確實很重要。
Python中有哪些可變範圍?
在Python中,範圍是指直接訪問變量的程序區域或文本區域。在執行過程中的任何時候,都有:
- 本地範圍:這是函數內定義的最內在範圍。對於此範圍,Python尋找局部變量。
- 封閉範圍:這些是嵌套函數的範圍。它們包含既不局部也不全球的非本地變量。
- 全局範圍:此範圍包含在模塊級別定義的變量,並且可以在整個模塊中訪問。
注意:您在程序中創建這些用戶定義的範圍以有效地運行它。但是,Python的內置變量也具有稱為內置範圍的範圍。
- 內置範圍:這是Python提供的所有預定義關鍵字或方法的範圍。因此,一旦Python解釋器啟動,這些都可以為您提供。另外,請注意,這些範圍永遠不會被刪除,並且可以在整個模塊中訪問。
LEGB規則是什麼?
現在,您對命名空間和可變範圍有基本的了解。讓我們更深入地了解如何用Python編程語言應用範圍。有一個常見的縮寫,legb規則,它可以實現廣闊的,封閉的,全球和建築物。
LEGB規則指出,解釋器可以從內而外搜索標識符,這意味著它首先在本地範圍中尋找可變名稱或名稱空間開始。如果在那裡沒有名稱空間,它將朝著程序的封閉範圍邁進。 Ext,它檢查全局範圍以找到名稱空間。最後,如果仍未找到標識符,解釋器會查看Python提供的內置範圍。
此外,如果解釋器在這些位置的任何一個中都找不到名稱,則Python提出了“ nameError”異常,這意味著該變量在程序中未定義。
同樣,要記住,您必須從當前範圍的LEGB規則的層次結構上向上移動。
另請閱讀:高級Python編程的綜合指南
Python可變範圍如何?
現在,讓我們從所有這些示例中進行一對一的了解,以深入了解所有這些概念:
1。在本地範圍中使用全局變量
為了理解這一點,讓我們以一個例子為例,這裡的函數` g(y) `不僅打印了全局變量` x```x ',還將其修改為` x 1 '。
現在,由於在g(y)'中未定義X` ,因此python獲取了全局變量` x '的值。
def g(y): 打印(x) 打印(x 1) #由於x不在本地範圍中 x = 1 g(x)#全局本地變量 打印(x)#全局變量
輸出
1<br><br> 2<br><br> 1
輸出顯示了“ x ”和“ x 1 ”的值確認全局變量X`保持不變,但本地範圍已使用它來正確輸出結果。
2.在本地範圍中使用本地變量
現在,查看此示例,在這裡我們有一個函數定義` g(y) ```g( y )```g'g'g',name x`定義為局部變量,也修改了。
def g(y): x = 10#本地變量 x = 1 打印(x) x = 1#全局變量 g(x) 打印(x)
輸出
11<br><br> 1
作為證據,全局“ X ”保持不變,局部變量使用其局部範圍變量來打印陳述,如預期的那樣,通過函數通過函數將11作為輸出和1個輸出,如所預期的。
另請閱讀:Python內置數據結構的綜合指南
3。修改本地範圍內的全局變量
但是,是否可以在不將其聲明為`` global ''的情況下修改全局變量'?
答案是否!您不能從本地範圍修改任何全局變量值,因為這樣做將導致錯誤。
def h(y): #功能可以使用全局變量,如果沒有任何 x = 10#,但無法更改本地變量內的全局值 x = 1 H(x) 打印(x)
輸出
Unboundlocalerror Trackback(最近的最新電話)<br><br> <ipython-input-3-130c677cc9ab>在<cell line>()<br><br> 3<br><br> 4 x = 1<br><br> ----> 5 h(x)<br><br> 6印刷(x)<br><br> <ipython-input-3-130c677cc9ab>在h(y)中<br><br> 1def H(y):<br><br> -----> 2 x = 10<br><br> 3<br><br> 4 x = 1<br><br> 5 h(x)</ipython-input-3-130c677cc9ab></cell></ipython-input-3-130c677cc9ab>
unboundlocalerror:分配前引用的本地變量
這會導致`` unbounlocalerror '',因為由於分配操作,python將x視為局部變量,但尚未在本地初始化。另外,儘管本地變量可以訪問全局變量,但您無法更改全局變量(您只能讀取,而不是寫)。
另請閱讀:初學者Python編程的基本面
4。使用聲明修改本地範圍內部的全局變量
但是,由於我一直告訴您Python實際上是一種甜美的語言,即使不建議對全局變量進行任何修改或更改。這並不意味著Python並不能給您這個功能,因為使用相同的關鍵字將`X'稱為“ global”,該函數可以修改全局變量`x` x'。
def h(y): 全局x#現在可以更改本地變量內的全局值 #但是,這不是編碼的好方法,您應該專注於減少此全局關鍵字用法 x = 10 x = 1 H(x) 打印(x)
輸出
11
輸出確認X`已在全球更新。但是,請記住,更改將影響整個程序,因為修改主函數也會影響其他功能,這不是很好的編程實踐。
5。使用功能修改全局變量inside本地範圍
另外,您可以通過將x x添加到10中來修改函數內的全局變量。它將打印新值並返回。
注意:這並不意味著您正在修改全局變量本身,無論如何,如果沒有``global''關鍵字。
def g(x): x = 10 打印(“在f(x)中:x =”,x) 返回x#返回f(x) x = 2 z = g(x) 打印(“在主要程序範圍:z =”,z) 打印(“在主要程序範圍:x =”,x)
輸出
在f(x)中:x = 12<br><br>在主要程序範圍中:z = 12<br><br>在主要程序範圍中:x = 2
在這裡,全局X`保持不變,而返回的值` z`是新的更新值。
什麼是嵌套功能?
在另一個` def`函數中定義的函數稱為嵌套函數或內部函數。
這是一個嵌套功能的示例,可以更好地理解:
def f(): def g(): 打印(“內部功能g”) g() 打印(“內部功能F”) F()
輸出
內部功能g<br><br>內部功能f
注意:嵌套函數`` g`在函數`` f ''中調用,從兩個函數中打印消息。呼叫函數`` g'f'f'flresults以外的錯誤,因為在全局範圍中未定義`` g '。
g()#此功能未在函數f之外定義
輸出
TypeError Trackback(最近的最新通話)<br><br> <ipython-input-8-5fd69ddb5074>在<cell>()<br><br> -----> 1 g()<br><br> typeError:g()缺少1所需的位置參數:'x'</cell></ipython-input-8-5fd69ddb5074>
變量的封閉範圍是什麼?
Python僅與嵌套函數中定義的名稱(稱為封閉範圍)提供了不同的特殊變量範圍。它也被稱為非本地範圍。當存在局部函數時,封閉範圍是外部函數的範圍,該函數是內部或嵌套函數。
def f(): x = 1 def g(): 打印(“內部功能g”) 打印(x) g() 打印(“內部功能F”) F()
此變量`x`都存在在封閉範圍內,您也可以在本地範圍中使用,如上所述。這就是IT輸出:
輸出
內部功能g<br><br> 1<br><br>內部功能f
現在,讓我們繼續前進,更好地理解這個新範圍。
7.修改封閉範圍內無聲明的全局變量
同樣,在嵌套函數內修改全局變量`是不可能的。
def g(x): def H(): x = 1 打印('in H(x):x =',x) x = x 1 打印('in g(x):x =',x) H(x) 返回x x = 3 z = g(x) 打印('在主要程序範圍:x =',x) 打印('在主要程序範圍:z =',z)
輸出
在g(x)中:x = 4<br><br> ----------------------------------------------------------------------------------------------------------------------------<br> TypeError Trackback(最近的最新通話)<br><br> <ipython-input-12-5bcfb2edb396>在<cell line>()<br><br> 9<br><br> 10 x = 3<br><br> ---> 11 z = g(x)<br><br> 12打印('在主要程序範圍:x =',x)<br><br> 13打印('在主要程序範圍:z =',z)<br><br> <ipython-input-12-5bcfb2edb396>在G(x)中<br><br> 5 x = x 1<br><br> 6打印('in g(x):x =',x)<br><br> ----> 7 h(x)<br><br> 8返回x<br><br> 9<br><br> TypeError:g。 <locals> .h()獲得0個位置參數,但給出了1個</locals></ipython-input-12-5bcfb2edb396></cell></ipython-input-12-5bcfb2edb396>
當函數` h() `時,無需任何參數而定義,但是`h(x)`被稱為參數。此外,這將給出一個“ typeError”。儘管封閉變量可以訪問全局變量,但您無法在全局變量中執行更改。
8。使用聲明在本地範圍內修改嵌套變量
與“全局”關鍵字相似,Python為開發人員提供了“非局部”關鍵字。這允許嵌套函數` h` h`可以修改封閉函數中定義的變量x 。
def g(x): def H(): 非局部x#告訴h()使用x(x)的x x = 1 打印('in H(x):x =',x) x = x 1 打印('in g(x):x =',x) h()#呼叫h()沒有任何參數 返回x x = 3 z = g(x) 打印('在主要程序範圍:x =',x) 打印('在主要程序範圍:z =',z)
輸出
在g(x)中:x = 4<br><br>在h(x)中:x = 5<br><br>在主要程序範圍中:x = 3<br><br>在主要程序範圍:z = 5
輸出顯示在兩個函數中所做的更改,並且全局變量` `X '保持不變。
最後,請注意,根據范圍定義的位置,每個範圍對應於整個程序中的不同級別訪問級別,並且在代碼中將具有不同的命名空間壽命。
另請閱讀:從頭開始學習數據科學的完整的Python教程
結論
本文探討了Python如何處理本地和全局變量以及嵌套功能。我們了解到,命名空間是Python為開發人員提供的詞典,您可以從中找到一個可變名稱及其值存儲在Python內存範圍中的值。此外,這些範圍分為四種:本地,封閉,全局和內置。
這些對於避免命名衝突和跟踪哪些名稱/標識符是指整個程序不同部分中的哪些對象非常有用。
另外,如果要從本地範圍中修改全局範圍中的變量,則可以使用` global '關鍵字。同樣,您可以使用“非局部”關鍵字來關閉範圍。
- 本地範圍:在函數內創建的變量,僅在該函數內訪問,並在函數返回或提出任何異常時被刪除,即,在編寫函數時未處理。
- 封閉或非本地範圍:在嵌套函數的外部功能中創建的變量,可供內部函數訪問。
- 全局範圍:在' __ -Main __程序中創建的變量,可以在整個程序中訪問,最後直到解釋器結束。
我希望這可以幫助您獲得撰寫良好生產級代碼的見解,同時遵循與行業相關的最佳實踐並減少開發人員定義的例外。但是,這是使我們的程序更加強大的第一步,我們還有更多涵蓋。
因此,請繼續關注下一篇文章,我們將在其中討論Python編程語言中的文件序列化和避免!
常見問題
Q1。 Python的名稱空間是什麼?Ans。 Python中的名稱空間組織和管理程序中的名稱或標識符。基本上,它們的作用就像存儲映射到其對象的名稱的容器或詞典一樣,例如變量和函數。
Q2。 Python中的LEGB規則是什麼? Ans。 Python中的LegB規則是Python解釋器在使用名稱或通常稱為標識符時抬起頭來的順序。它代表本地,封閉,全球和內置:
1。本地:函數中定義的名稱。
2。封閉:任何封閉功能的本地範圍(嵌套函數)中的名稱。
3。全局:在腳本或模塊的頂層定義的名稱。
內置:在Python中預定的名稱,例如`` print '''或` Len '。
Ans。全局關鍵字允許函數修改全局範圍中定義的變量,並使變量能夠駐留在操作之外。注意:僅僅因為您可以做到這一點,並不意味著您應該(經常)使用它,因為這不是一個好的編程實踐。
Q4。為什麼建議最大程度地減少全局變量的使用?Ans。過度使用全球變量可能會導致難以理解和維護的程序。這也可能導致意外變化,從而使調試變得更加困難。通常最好使用本地變量並根據需要傳遞它們。
Q5。嵌套函數中`非局部`關鍵字的用途是什麼?Ans。與全局關鍵字相似,Python提供了“非局部”關鍵字來修改封閉變量。非本地關鍵字可以修改嵌套函數的封閉函數中定義的變量,從而提供了一種控制嵌套函數中變量範圍的方法。
以上是Python名稱空間和可變範圍的綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

讓我們討論“共鳴”作為AI領域的評估度量的上升。該分析是我正在進行的《福布斯》列的一部分,探索了AI開發的複雜方面(請參見此處的鏈接)。 AI評估中的共鳴 傳統

Waymo的亞利桑那工廠:批量生產自動駕駛美洲虎及以後 Waymo位於亞利桑那州鳳凰城附近,經營著最先進的設施,生產其自動jaguar i-pace電動SUV機隊。 這個239,000平方英尺的工廠開業

標準普爾全球首席數字解決方案官Jigar Kocherlakota討論了公司的AI旅程,戰略收購和未來的數字化轉型。 變革性的領導角色和未來的準備團隊 Kocherlakota的角色

從應用到生態系統:導航數字景觀 數字革命遠遠超出了社交媒體和AI。 我們正在見證“所有應用程序”的興起 - 綜合數字生態系統整合了生活的各個方面。 山姆A。

萬事達卡代理工資:AI驅動的付款革新商業 雖然Visa的AI驅動交易功能成為頭條新聞,但萬事達卡揭開了代理商的薪酬,建立在代幣化,信任和代理的基礎上的更高級的AI本地支付系統

Future Ventures Fund IV:一項耗資2億美元的新技術押注 Future Ventures最近關閉了其超額認購的IV,總計2億美元。 這項由史蒂夫·朱維森(Steve Jurvetson),瑪麗娜·薩恩科(Maryanna Saenko)和尼科·恩里克斯(Nico Enriquez)管理的新基金代表

隨著AI應用的爆炸式增長,企業正從傳統的搜索引擎優化(SEO)轉向生成式引擎優化(GEO)。 谷歌正引領這一轉變。其“AI概述”功能已服務於超過十億用戶,在用戶點擊鏈接之前提供完整的答案。 [^2] 其他參與者也在迅速崛起。 ChatGPT、微軟Copilot和Perplexity正在創造一種全新的“答案引擎”類別,完全繞過了傳統的搜索結果。 如果您的企業沒有出現在這些AI生成的答案中,潛在客戶可能永遠不會發現您——即使您在傳統的搜索結果中排名靠前。 從SEO到GEO——這究竟意味著什麼? 幾十年來

讓我們探索人工通用智能(AGI)的潛在途徑。 該分析是我正在進行的《福布斯》列的AI進步的一部分,並深入研究了達到AGI和人工超智慧(ASI)的複雜性。 (請參閱相關藝術


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中