採用英文翻譯
範圍的概念規定瞭如何在代碼中查找變量和名稱。 它確定代碼中變量的可見性。 名稱或變量的範圍取決於您在代碼中創建該變量的位置。 Python 範圍概念通常使用稱為 LEGB 規則的規則來呈現。 首字母縮略詞 LEGB 中的字母代表本地、封閉、全局和內置範圍。 這不僅總結了 Python 範圍級別,還總結了 Python 在解析程序中的名稱時遵循的步驟順序。
在本教程中,您將學習: 什麼是作用域以及它們如何在 Python 中工作 為什麼了解 Python 作用域很重要 LEGB 規則是什麼以及 Python 如何使用它來解析名稱 如何使用全局和非本地修改 Python 作用域的標準行為 Python 提供了哪些與作用域相關的工具以及如何使用它們 掌握這些知識後,您可以利用 Python 作用域編寫更可靠和可維護的程序。 使用 Python 作用域將幫助您避免或最小化與名稱衝突相關的錯誤以及在程序中錯誤使用全局名稱。 如果您熟悉類、函數、內部函數、變量、異常、推導式、內置函數和標準數據結構等中級 Python 概念,您將從本教程中獲得最大收益。
了解範圍 在編程中,名稱的範圍定義了程序中可以明確訪問該名稱的區域,例如變量、函數、對像等。名稱僅對其範圍內的代碼可見和可訪問。幾種編程語言利用範圍來避免名稱衝突和不可預測的行為。最常見的是,您會區分兩個通用範圍: 全局範圍:您在此範圍內定義的名稱可用於您的所有代碼。 本地範圍:您在此範圍內定義的名稱僅對范圍內的代碼可用或可見。 Scope 的出現是因為早期的編程語言(如 BASIC)只有全局名稱。有了這種名稱,程序的任何部分都可以隨時修改任何變量,因此維護和調試大型程序可能成為一場真正的噩夢。要使用全局名稱,您需要同時記住所有代碼以隨時了解給定名稱的值。這是沒有範圍的一個重要副作用。 一些語言比如 Python 使用作用域來避免這種問題。當您使用實現作用域的語言時,您無法訪問該程序中所有位置的所有變量。在這種情況下,您訪問給定名稱的能力將取決於您定義該名稱的位置。 注意:您將使用術語名稱來指代變量、常量、函數、類或任何其他可以分配名稱的對象的標識符。 您程序中的名稱將具有您定義它們的代碼塊的範圍。當您可以從代碼中的某個地方訪問給定名稱的值時,您會說該名稱在範圍內。如果您無法訪問該名稱,那麼您會說該名稱超出範圍。
Python 中的名稱和作用域 由於 Python 是一種動態類型語言,當您第一次為它們賦值時,Python 中的變量就會存在。另一方面,函數和類在您分別使用 def 或 class 定義後可用。最後,模塊在你導入後就存在了。總之,您可以通過以下操作之一創建 Python 名稱: 操作說明 分配 x = 值 導入操作導入模塊或從模塊導入名稱 函數定義 def my_func(): ... 函數上下文中的參數定義 def my_func (arg1, arg2, ... argN): ... 類定義類 MyClass: ... 所有這些操作都會創建或在賦值的情況下更新新的 Python 名稱,因為它們都將名稱分配給變量、常量、函數、類、實例、模塊或其他 Python 對象。 注意:賦值操作和引用或訪問操作之間有一個重要的區別。當您引用一個名稱時,您只是在檢索其內容或值。分配名稱時,您要么創建該名稱,要么修改它。 Python 使用名稱分配或定義的位置將其與特定範圍相關聯。換句話說,您在代碼中分配或定義名稱的位置決定了該名稱的範圍或可見性。 例如,如果您為函數內的名稱賦值,則該名稱將具有本地 Python 作用域。相反,如果您為所有函數之外的名稱賦值——例如,在模塊的頂層——那麼該名稱將具有全局 Python 作用域。
Python 作用域與命名空間 在 Python 中,作用域的概念與命名空間的概念密切相關。到目前為止,您已經了解到,Python 作用域決定了名稱在程序中的可見位置。 Python 作用域被實現為將名稱映射到對象的字典。這些字典通常稱為命名空間。這些是 Python 用於存儲名稱的具體機制。它們存儲在一個名為 .__ dict__ 的特殊屬性中。 模塊頂層的名稱存儲在模塊的命名空間中。換句話說,它們存儲在模塊的 .__ dict__ 屬性中。看看下面的代碼: >>> 導入系統 >>> sys .__ dict __.keys () dict_keys (['__ name__', '__doc__', '__package __', ..., 'argv', 'ps1', 'ps2']) 導入 sys 後,您可以使用 .keys() 檢查 sys .__ dict__ 的鍵。這將返回一個列表,其中包含在模塊頂層定義的所有名稱。在這種情況下,你可以說 .__ dict__ 持有 sys 的命名空間,是模塊作用域的具體表示。 注意:為了節省篇幅,本教程中某些示例的輸出被縮寫為 (...)。輸出可能會根據您的平台、Python 版本,甚至您使用當前 Python 交互式會話的時間長短而有所不同。 再舉一個例子,假設您需要使用名稱 ps1,它在 sys.path 中定義。如果你知道 .__ dict__ 和 namespaces 在 Python 中是如何工作的,那麼你至少可以通過兩種不同的方式來引用 ps1: 在 module.name 形式的模塊名稱上使用點符號 在表單模塊 .__ dict __ ['name'] 中對 .__ dict__ 使用訂閱操作 看看下面的代碼: >>> sys.ps1 '>>>' >>> sys .__ dict __ ['ps1'] '>>>' 導入 sys 後,您可以使用 sys 上的點表示法訪問 ps1。您還可以使用帶有鍵“ps1”的字典鍵查找來訪問 ps1。兩個操作都返回相同的結果,“>>>”。 注意:ps1 是一個字符串,指定 Python 解釋器的主要提示。 ps1 僅在解釋器處於交互模式且其初始值為“>>>”時才定義。 無論何時使用名稱,例如變量或函數名稱,Python 都會搜索不同的範圍級別(或命名空間)以確定該名稱是否存在。如果名稱存在,那麼您將始終得到它的第一次出現。否則,你會得到一個錯誤。您將在下一節中介紹這種搜索機制。