<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 14:22:57
        文檔

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

        Python有關名字綁定的相關介紹:Python的名字綁定在Python中,對象是通過名字進行關聯和引用的。Python通過名字綁定操作來引入名字。Python中的所謂的代碼塊就是一段作為執行單元的程序。比如:模塊、函數、類定義。在交互式環境中輸入的命令也是代碼塊的一種。一個Python腳本文件也是
        推薦度:
        導讀Python有關名字綁定的相關介紹:Python的名字綁定在Python中,對象是通過名字進行關聯和引用的。Python通過名字綁定操作來引入名字。Python中的所謂的代碼塊就是一段作為執行單元的程序。比如:模塊、函數、類定義。在交互式環境中輸入的命令也是代碼塊的一種。一個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 'a' 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 模塊,然后修改這個模塊中相應的屬性。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        Python有關名字綁定的相關介紹:Python的名字綁定在Python中,對象是通過名字進行關聯和引用的。Python通過名字綁定操作來引入名字。Python中的所謂的代碼塊就是一段作為執行單元的程序。比如:模塊、函數、類定義。在交互式環境中輸入的命令也是代碼塊的一種。一個Python腳本文件也是
        推薦度:
        標簽: 綁定 名字 定的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 67194国产精品免费观看| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲精品视频免费观看| 亚洲av成人无码网站…| 永久免费AV无码网站在线观看| 亚洲人6666成人观看| 国产精品成人观看视频免费 | free哆拍拍免费永久视频 | 无码av免费一区二区三区| 国产亚洲美女精品久久久2020| 久久亚洲精品国产精品黑人| 精品在线免费观看| 亚洲性69影院在线观看| 成视频年人黄网站免费视频| 亚洲中文字幕一区精品自拍| 全免费a级毛片免费看无码| 免费观看亚洲人成网站| 国产gv天堂亚洲国产gv刚刚碰| 日本高清不卡aⅴ免费网站| 亚洲视频一区调教| 免费无码精品黄AV电影| mm1313亚洲国产精品无码试看| 亚洲国产成人精品女人久久久| 黄桃AV无码免费一区二区三区| 亚洲无线电影官网| 色婷婷7777免费视频在线观看| 午夜亚洲WWW湿好爽| 中文字幕精品亚洲无线码一区| 免费无码中文字幕A级毛片| 亚洲另类无码一区二区三区| 免费在线观看理论片| 无码免费一区二区三区免费播放 | 四虎在线成人免费网站| 精品久久久久久亚洲综合网| 久久精品国产精品亚洲| 4虎1515hh永久免费| 国产亚洲综合一区二区三区| 亚洲国产精品无码中文字| 成人免费777777| 久草免费福利视频| 亚洲国产成人久久精品软件|