首頁 後端開發 Python教學 Python有關名字綁定的相關介紹

Python有關名字綁定的相關介紹

Sep 04, 2017 am 11:33 AM
python 相關

Python的名字綁定

在Python中,物件是透過名字進行關聯和引用的。 Python透過名字綁定操作來引入名字。

Python中的所謂的程式碼區塊就是一段作為執行單元的程式。例如:模組、函數、類別定義。在互動式環境中輸入的命令也是程式碼區塊的一種。一個Python腳本檔也是一個程式碼區塊。還有就是,當我們在命令列上使用-c選項指定的命令也是一個程式碼區塊。傳遞給內建函數eval()和exec()的字串參數也是程式碼區塊的一種。

程式碼區塊是以執行幀的方式被執行的,一個執行幀包含了一些管理訊息,可以用於調試。執行訊框也會在執行完目前的程式碼區塊以後指定在何處,以怎樣的方式執行接下來的程式碼。

Python中的作用域定義了名字在程式碼區塊中的可見性。如果在程式碼區塊中定義了一個局部變量,那麼這個局部變數的作用域就是所在的這個程式碼區塊。如果這個定義發生在函數體內,則這個變數的作用域就擴展到包含在這個函數中的任何程式碼區塊中,但是,如果包含在這個函數中的一個程式碼區塊中,同樣的名字被綁定到了不同的物件上,那麼外面的名字將不能被擴展到這個程式碼區塊。

def out_func():
    #a的作用域在out_func这个函数中
    a = 0
    b = 0
    def in_func():
    #a的作用域从out_func扩展到了in_func中,因为in_func这个代码块包含在out_func中
    print(a)
    #out_func函数中的b不能扩展到in_func中,因为在in_func中,b重新绑定到了不同的对象上,所以在out_func中的b的作用域不能扩展到in_func中。
    b = 1
登入後複製

在Python中,定義在類別程式碼區塊中名字只能在類別中可見,且類別中的名字的作用域不能擴展到類別中的方法中。如果在類別定義中出現了生成器表達式和列表展開,那麼類別中的名字也不能擴展到這些表達式中,因為列表展開和生成器表達式的實作都是使用函數作用域的。

class C:
    a = 0
    # 在列表表达式中,a会因为未定义而抛出NameError异常
    b = list(a + i for i in range(10))
    def method(self):
        #由于定义在类中的名字不能扩展到方法中,所以下面的语句是错误的,会抛出a未定义的NameError异常
        print(a)
登入後複製

當在一個程式碼區塊中使用一個名字的時候,會對最近的外圍作用域進行解析,以找出這個名字。所有的這些在目前程式碼區塊中可見的作用域的集合,稱為

目前的程式碼區塊的環境。

名字綁定和作用域的關係

如果一個名字綁定到一個程式碼區塊中,除非這個名字宣告為nonlocal(nonlocal宣告的作用是:使得變數在外圍作用域中,在全域作用域之前被解析),否則這個名字就是這個程式碼區塊的局部變數。如果一個名字被綁定到模組級別,則這個名字的作用域是全域的,這個變數是全域變數(模組中的變量,對於模組而言是局部變量,而對於模組中的程式碼區塊而言,則是全域變數)。如果一個名字在一個程式碼區塊中使用,但是不是在這個程式碼區塊中被定義的,則這個變數就是一個自由變數。

名字綁定相關的異常

如果在進行名字查找的時候,名字沒有被找到,則會拋出一個NameError 異常,如果名字引用的是一個局部變量,但是這個名字還沒有被綁定到這個局部變量,則會拋出一個UnboundLocalError 異常(UnboundLocalError 是NameError的子類別)。

發生名字綁定行為的情況

發生名字綁定的行為主要有:

通常的給函數傳遞參數的時候,參數名稱會和傳遞過來的物件進行綁定

使用import語句進行導入的時候,其中from ... import * 語句會將被導入的模組中的所有可以被導入的名字進行綁定操作

類別定義的時候

函數定義的時候

進行賦值運算的時候

在for迴圈的for語句中

在with語句中的as後面

在expect語句中的as後面

Python中的名字綁定的Pitfall

在Python中,名字綁定的一些規則,會導致在使用名字的時候,出現不能理解的錯誤,特別是對於有C、C++ 和Java經驗的使用者。

在Python中,名字綁定操作無論發生在目前區塊的 任何 位置,在這個程式碼區塊中對這個名字的參考都會使用在目前區塊中綁定的物件。那麼,問題就來了,如果我們在名字綁定操作發生之前對這個名字進行了引用,那麼就會出現錯誤,拋出 UnboundLocalError 異常。

>>> a = 10
>>> def function():
print(a)
a = 20# a的绑定操作发生在print之前
>>> function()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    function()
  File "<pyshell#4>", line 2, in function
    print(a)
UnboundLocalError: local variable &#39;a&#39; referenced before assignment
登入後複製

在Python中,程式碼區塊中的局部變數可以透過掃描整個程式碼區塊來獲得綁定的名字,所以在上面的程式碼中,a這個名字在執行print的時候透過對程式碼區塊的掃描已經被找到,但是名字a的綁定操作卻還沒發生,所以出現了錯誤。

在上面的程式碼中,如果我們需要外面定義的全域變數a,則可以使用global 語句進行宣告。

>>> a = 10
>>> def function():
global a
print(a)
a = 20#这里并不引入新的名字,而是将全局变量a绑定到20上
>>> function()
10
>>> a
20
登入後複製

global 語句的作用是,使得後面對透過這條語句宣告的物件的引用,使用的是頂層名字空間中的名字。在頂層名字空間中,包含了全域名字空間和內建名字空間,全域名字空間會先被搜索,如果沒有找到,會對內建名字空間進行搜尋。 global 語句必須出現在名字使用之前。

如果在外圍作用域中的自由變數包含了一個global聲明,則這個自由變數被認為是全域的。

內建名字空間

在尋找內建名字空間的時候,會存取目前程式碼區塊的全域名字空間中的 __builtins__名字,這個名字引用的是一個名字字典或是一個模組。在 __main__ 模組中, __builtins__ 的引用是內建模區塊 builtins,然而,如果是在其他模組中, __builtins__ 引用的是 builtins 模組的名字字典。

注意:

CPython的實作中,不能手動修改__builtins__ 這個變量,如果需要覆蓋這個內建名字空間中的名字,需要導入builtins 模組,然後修改這個模組中相應的屬性。

以上是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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

HadiDB:Python 中的輕量級、可水平擴展的數據庫 HadiDB:Python 中的輕量級、可水平擴展的數據庫 Apr 08, 2025 pm 06:12 PM

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

mysql 無法連接到本地主機怎麼解決 mysql 無法連接到本地主機怎麼解決 Apr 08, 2025 pm 02:24 PM

無法連接 MySQL 可能是由於以下原因:MySQL 服務未啟動、防火牆攔截連接、端口號錯誤、用戶名或密碼錯誤、my.cnf 中的監聽地址配置不當等。排查步驟包括:1. 檢查 MySQL 服務是否正在運行;2. 調整防火牆設置以允許 MySQL 監聽 3306 端口;3. 確認端口號與實際端口號一致;4. 檢查用戶名和密碼是否正確;5. 確保 my.cnf 中的 bind-address 設置正確。

mysql workbench 可以連接到 mariadb 嗎 mysql workbench 可以連接到 mariadb 嗎 Apr 08, 2025 pm 02:33 PM

MySQL Workbench 可以連接 MariaDB,前提是配置正確。首先選擇 "MariaDB" 作為連接器類型。在連接配置中,正確設置 HOST、PORT、USER、PASSWORD 和 DATABASE。測試連接時,檢查 MariaDB 服務是否啟動,用戶名和密碼是否正確,端口號是否正確,防火牆是否允許連接,以及數據庫是否存在。高級用法中,使用連接池技術優化性能。常見錯誤包括權限不足、網絡連接問題等,調試錯誤時仔細分析錯誤信息和使用調試工具。優化網絡配置可以提升性能

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 Apr 09, 2025 pm 03:09 PM

作為數據專業人員,您需要處理來自各種來源的大量數據。這可能會給數據管理和分析帶來挑戰。幸運的是,兩項 AWS 服務可以提供幫助:AWS Glue 和 Amazon Athena。

2小時的Python計劃:一種現實的方法 2小時的Python計劃:一種現實的方法 Apr 11, 2025 am 12:04 AM

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

See all articles