目錄
介紹
概述
目錄
Python中有什麼變量?
全局變量
本地變量
命名空間是什麼?
Python中有哪些可變範圍?
LEGB規則是什麼?
Python可變範圍如何?
1。在本地範圍中使用全局變量
輸出
2.在本地範圍中使用本地變量
3。修改本地範圍內的全局變量
4。使用聲明修改本地範圍內部的全局變量
5。使用功能修改全局變量inside本地範圍
什麼是嵌套功能?
變量的封閉範圍是什麼?
7.修改封閉範圍內無聲明的全局變量
8。使用聲明在本地範圍內修改嵌套變量
結論
常見問題
首頁 科技週邊 人工智慧 Python名稱空間和可變範圍的綜合指南

Python名稱空間和可變範圍的綜合指南

Apr 12, 2025 pm 12:00 PM

介紹

了解Python函數中變量的名稱空間,範圍和行為對於有效編寫和避免運行時錯誤或異常至關重要。在本文中,我們將深入研究名稱空間和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名稱空間和可變範圍的綜合指南

此外,如果解釋器在這些位置的任何一個中都找不到名稱,則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 '關鍵字。同樣,您可以使用“非局部”關鍵字來關閉範圍。

  1. 本地範圍:在函數內創建的變量,僅在該函數內訪問,並在函數返回或提出任何異常時被刪除,即,在編寫函數時未處理。
  2. 封閉或非本地範圍:在嵌套函數的外部功能中創建的變量,可供內部函數訪問。
  3. 全局範圍:在' __ -Main __程序中創建的變量,可以在整個程序中訪問,最後直到解釋器結束。

我希望這可以幫助您獲得撰寫良好生產級代碼的見解,同時遵循與行業相關的最佳實踐並減少開發人員定義的例外。但是,這是使我們的程序更加強大的第一步,我們還有更多涵蓋。

因此,請繼續關注下一篇文章,我們將在其中討論Python編程語言中的文件序列化和避免!

常見問題

Q1。 Python的名稱空間是什麼?

Ans。 Python中的名稱空間組織和管理程序中的名稱或標識符。基本上,它們的作用就像存儲映射到其對象的名稱的容器或詞典一樣,例如變量和函數。

Q2。 Python中的LEGB規則是什麼?

Ans。 Python中的LegB規則是Python解釋器在使用名稱或通常稱為標識符時抬起頭來的順序。它代表本地,封閉,全球和內置:
1。本地:函數中定義的名稱。
2。封閉:任何封閉功能的本地範圍(嵌套函數)中的名稱。
3。全局:在腳本或模塊的頂層定義的名稱。
內置:在Python中預定的名稱,例如`` print '''或` Len '。

Q3。 python中`global'關鍵字的用途是什麼?

Ans。全局關鍵字允許函數修改全局範圍中定義的變量,並使變量能夠駐留在操作之外。注意:僅僅因為您可以做到這一點,並不意味著您應該(經常)使用它,因為這不是一個好的編程實踐。

Q4。為什麼建議最大程度地減少全局變量的使用?

Ans。過度使用全球變量可能會導致難以理解和維護的程序。這也可能導致意外變化,從而使調試變得更加困難。通常最好使用本地變量並根據需要傳遞它們。

Q5。嵌套函數中`非局部`關鍵字的用途是什麼?

Ans。與全局關鍵字相似,Python提供了“非局部”關鍵字來修改封閉變量。非本地關鍵字可以修改嵌套函數的封閉函數中定義的變量,從而提供了一種控制嵌套函數中變量範圍的方法。

以上是Python名稱空間和可變範圍的綜合指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1660
14
CakePHP 教程
1417
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
開始使用Meta Llama 3.2 -Analytics Vidhya 開始使用Meta Llama 3.2 -Analytics Vidhya Apr 11, 2025 pm 12:04 PM

Meta的Llama 3.2:多模式和移動AI的飛躍 Meta最近公佈了Llama 3.2,這是AI的重大進步,具有強大的視覺功能和針對移動設備優化的輕量級文本模型。 以成功為基礎

10個生成AI編碼擴展,在VS代碼中,您必須探索 10個生成AI編碼擴展,在VS代碼中,您必須探索 Apr 13, 2025 am 01:14 AM

嘿,編碼忍者!您當天計劃哪些與編碼有關的任務?在您進一步研究此博客之前,我希望您考慮所有與編碼相關的困境,這是將其列出的。 完畢? - 讓&#8217

AV字節:Meta&#039; llama 3.2,Google的雙子座1.5等 AV字節:Meta&#039; llama 3.2,Google的雙子座1.5等 Apr 11, 2025 pm 12:01 PM

本週的AI景觀:進步,道德考慮和監管辯論的旋風。 OpenAI,Google,Meta和Microsoft等主要參與者已經釋放了一系列更新,從開創性的新車型到LE的關鍵轉變

向員工出售AI策略:Shopify首席執行官的宣言 向員工出售AI策略:Shopify首席執行官的宣言 Apr 10, 2025 am 11:19 AM

Shopify首席執行官TobiLütke最近的備忘錄大膽地宣布AI對每位員工的基本期望是公司內部的重大文化轉變。 這不是短暫的趨勢。這是整合到P中的新操作範式

視覺語言模型(VLMS)的綜合指南 視覺語言模型(VLMS)的綜合指南 Apr 12, 2025 am 11:58 AM

介紹 想像一下,穿過​​美術館,周圍是生動的繪畫和雕塑。現在,如果您可以向每一部分提出一個問題並獲得有意義的答案,該怎麼辦?您可能會問:“您在講什麼故事?

GPT-4O vs OpenAI O1:新的Openai模型值得炒作嗎? GPT-4O vs OpenAI O1:新的Openai模型值得炒作嗎? Apr 13, 2025 am 10:18 AM

介紹 Openai已根據備受期待的“草莓”建築發布了其新模型。這種稱為O1的創新模型增強了推理能力,使其可以通過問題進行思考

如何在SQL中添加列? - 分析Vidhya 如何在SQL中添加列? - 分析Vidhya Apr 17, 2025 am 11:43 AM

SQL的Alter表語句:動態地將列添加到數據庫 在數據管理中,SQL的適應性至關重要。 需要即時調整數據庫結構嗎? Alter表語句是您的解決方案。本指南的詳細信息添加了Colu

最新的最佳及時工程技術的年度彙編 最新的最佳及時工程技術的年度彙編 Apr 10, 2025 am 11:22 AM

對於那些可能是我專欄新手的人,我廣泛探討了AI的最新進展,包括體現AI,AI推理,AI中的高科技突破,及時的工程,AI培訓,AI,AI RE RE等主題

See all articles