<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](import.xhtml "5. 導入系統") | - [上一頁](datamodel.xhtml "3. 數據模型") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | # 4. 執行模型 ## 4.1. 程序的結構 Python 程序是由代碼塊構成的。 *代碼塊* 是被作為一個單元來執行的一段 Python 程序文本。 以下幾個都是代碼塊:模塊、函數體和類定義。 交互式輸入的每條命令都是一個代碼塊。 一個腳本文件(作為標準輸入發送給解釋器或是作為命令行參數發送給解釋器的文件)也是一個代碼塊。 一條腳本命令(通過 [`-c`](../using/cmdline.xhtml#cmdoption-c) 選項在解釋器命令行中指定的命令)也是一個代碼塊。 傳遞給內置函數 [`eval()`](../library/functions.xhtml#eval "eval") 和 [`exec()`](../library/functions.xhtml#exec "exec") 的字符串參數也是代碼塊。 代碼塊在 *執行幀* 中被執行。 一個幀會包含某些管理信息(用于調試)并決定代碼塊執行完成后應前往何處以及如何繼續執行。 ## 4.2. 命名與綁定 ### 4.2.1. 名稱的綁定 *名稱* 用于指代對象。 名稱是通過名稱綁定操作來引入的。 以下構造會綁定名稱:傳給函數的正式形參,[`import`](simple_stmts.xhtml#import) 語句,類與函數定義(這會在定義的代碼塊中綁定類或函數名稱)以及發生以標識符為目標的賦值,[`for`](compound_stmts.xhtml#for) 循環的開頭,或 [`with`](compound_stmts.xhtml#with) 語句和 [`except`](compound_stmts.xhtml#except) 子句的 `as` 之后。 `import` 語句的 `from ... import *` 形式會綁定在被導入模塊中定義的所有名稱,那些以下劃線開頭的除外。 這種形式僅在模塊層級上被使用。 [`del`](simple_stmts.xhtml#del) 語句的目標也被視作一種綁定(雖然其實際語義為解除名稱綁定)。 每條賦值或導入語句均發生于類或函數內部定義的代碼塊中,或是發生于模塊層級(即最高層級的代碼塊)。 如果名稱綁定在一個代碼塊中,則為該代碼塊的局部變量,除非聲明為 [`nonlocal`](simple_stmts.xhtml#nonlocal) 或 [`global`](simple_stmts.xhtml#global)。 如果名稱綁定在模塊層級,則為全局變量。 (模塊代碼塊的變量既為局部變量又為全局變量。) 如果變量在一個代碼塊中被使用但不是在其中定義,則為 *自由變量*。 每個在程序文本中出現的名稱是指由以下名稱解析規則所建立的對該名稱的 *綁定*。 ### 4.2.2. 名稱的解析 *作用域* 定義了一個代碼塊中名稱的可見性。 如果代碼塊中定義了一個局部變量,則其作用域包含該代碼塊。 如果定義發生于函數代碼塊中,則其作用域會擴展到該函數所包含的任何代碼塊,除非有某個被包含代碼塊引入了對該名稱的不同綁定。 當一個名稱在代碼塊中被使用時,會由包含它的最近作用域來解析。 對一個代碼塊可見的所有這種作用域的集合稱為該代碼塊的 *環境*。 當一個名稱完全找不到時,將會引發 [`NameError`](../library/exceptions.xhtml#NameError "NameError") 異常。 如果當前作用域為函數作用域,且該名稱指向一個局部變量,而此變量在該名稱被使用的時候尚未綁定到特定值,將會引發 [`UnboundLocalError`](../library/exceptions.xhtml#UnboundLocalError "UnboundLocalError") 異常。 [`UnboundLocalError`](../library/exceptions.xhtml#UnboundLocalError "UnboundLocalError") 為 [`NameError`](../library/exceptions.xhtml#NameError "NameError") 的一個子類。 如果一個代碼塊內的任何位置發生名稱綁定操作,則代碼塊內所有對該名稱的使用會被認為是對當前代碼塊的引用。 當一個名稱在其被綁定前就在代碼塊內被使用時則會導致錯誤。 這個一個很微妙的規則。 Python 缺少聲明語法,并允許名稱綁定操作發生于代碼塊內的任何位置。 一個代碼塊的局部變量可通過在整個代碼塊文本中掃描名稱綁定操作來確定。 如果 [`global`](simple_stmts.xhtml#global) 語句出現在一個代碼塊中,則所有對該語句所指定名稱的使用都是在最高層級命名空間內對該名稱綁定的引用。 名稱在最高層級命名內的解析是通過全局命名空間,也就是包含該代碼塊的模塊的命名空間,以及內置命名空間即 [`builtins`](../library/builtins.xhtml#module-builtins "builtins: The module that provides the built-in namespace.") 模塊的命名空間。 全局命名空間會先被搜索。 如果未在其中找到指定名稱,再搜索內置命名空間。 `global` 語句必須位于所有對其所指定名稱的使用之前。 [`global`](simple_stmts.xhtml#global) 語句與同一代碼塊中名稱綁定具有相同的作用域。 如果一個自由變量的最近包含作用域中有一條 global 語句,則該自由變量也會被當作是全局變量。 [`nonlocal`](simple_stmts.xhtml#nonlocal) 語句會使得相應的名稱指向之前在最近包含函數作用域中綁定的變量。 如果指定名稱不存在于任何包含函數作用域中則將在編譯時引發 [`SyntaxError`](../library/exceptions.xhtml#SyntaxError "SyntaxError")。 模塊的作用域會在模塊第一次被導入時自動創建。 一個腳本的主模塊總是被命名為 [`__main__`](../library/__main__.xhtml#module-__main__ "__main__: The environment where the top-level script is run.")。 類定義代碼塊以及傳給 [`exec()`](../library/functions.xhtml#exec "exec") 和 [`eval()`](../library/functions.xhtml#eval "eval") 的參數是名稱解析上下文中的特殊情況。 類定義是可能使用并定義名稱的可執行語句。 這些引用遵循正常的名稱解析規則,例外之處在于未綁定的局部變量將會在全局命名空間中查找。 類定義的命名空間會成為該類的屬性字典。 在類代碼塊中定義的名稱的作用域會被限制在類代碼塊中;它不會擴展到方法的代碼塊中 -- 這也包括推導式和生成器表達式,因為它們都是使用函數作用域實現的。 這意味著以下代碼將會失敗: ``` class A: a = 42 b = list(a + i for i in range(10)) ``` ### 4.2.3. 內置命名空間和受限的執行 **CPython implementation detail:** 用戶不應該接觸 `__builtins__`,嚴格說來它屬于實現細節。 用戶如果要重載內置命名空間中的值則應該 [`import`](simple_stmts.xhtml#import) [`builtins`](../library/builtins.xhtml#module-builtins "builtins: The module that provides the built-in namespace.") 并相應地修改該模塊中的屬性。 與一個代碼塊的執行相關聯的內置命名空間實際上是通過在其全局命名空間中搜索名稱 `__builtins__` 來找到的;這應該是一個字典或一個模塊(在后一種情況下會使用該模塊的字典)。 默認情況下,當在 [`__main__`](../library/__main__.xhtml#module-__main__ "__main__: The environment where the top-level script is run.") 模塊中時,`__builtins__` 就是內置模塊 [`builtins`](../library/builtins.xhtml#module-builtins "builtins: The module that provides the built-in namespace.");當在任何其他模塊中時,`__builtins__` 則是 [`builtins`](../library/builtins.xhtml#module-builtins "builtins: The module that provides the built-in namespace.") 模塊自身的字典的一個別名。 ### 4.2.4. 與動態特性的交互 自由變量的名稱解析發生于運行時而不是編譯時。 這意味著以下代碼將打印出 42: ``` i = 10 def f(): print(i) i = 42 f() ``` [`eval()`](../library/functions.xhtml#eval "eval") 和 [`exec()`](../library/functions.xhtml#exec "exec") 函數沒有對完整環境的訪問權限來解析名稱。 名稱可以在調用者的局部和全局命名空間中被解析。 自由變量的解析不是在最近包含命名空間中,而是在全局命名空間中。 [1](#id3) [`exec()`](../library/functions.xhtml#exec "exec") 和 [`eval()`](../library/functions.xhtml#eval "eval") 函數有可選參數用來重載全局和局部命名空間。 如果只指定一個命名空間,則它會同時作用于兩者。 ## 4.3. 異常 異常是中斷代碼塊的正常控制流程以便處理錯誤或其他異常條件的一種方式。 異常會在錯誤被檢測到的位置 *引發*,它可以被當前包圍代碼塊或是任何直接或間接發起調用發生錯誤的代碼塊的其他代碼塊所 *處理*。 Python 解析器會在檢測到運行時錯誤(例如零作為被除數)的時候引發異常。 Python 程序也可以通過 [`raise`](simple_stmts.xhtml#raise) 語句顯式地引發異常。 異常處理是通過 [`try`](compound_stmts.xhtml#try) ... [`except`](compound_stmts.xhtml#except) 語句來指定的。 該語句的 [`finally`](compound_stmts.xhtml#finally) 子句可被用來指定清理代碼,它并不處理異常,而是無論之前的代碼是否發生異常都會被執行。 Python 的錯誤處理采用的是“終止”模型:異常處理器可以找出發生了什么問題,并在外層繼續執行,但它不能修復錯誤的根源并重試失敗的操作(除非通過從頂層重新進入出錯的代碼片段)。 When an exception is not handled at all, the interpreter terminates execution of the program, or returns to its interactive main loop. In either case, it prints a stack traceback, except when the exception is [`SystemExit`](../library/exceptions.xhtml#SystemExit "SystemExit"). 異常是通過類實例來標識的。 [`except`](compound_stmts.xhtml#except) 子句會依據實例的類來選擇:它必須引用實例的類或是其所屬的基類。 實例可通過處理器被接收,并可攜帶有關異常條件的附加信息。 注解 異常消息不是 Python API 的組成部分。 其內容可能在 Python 升級到新版本時不經警告地發生改變,不應該被需要在多版本解釋器中運行的代碼所依賴。 另請參看 [try 語句](compound_stmts.xhtml#try) 小節中對 [`try`](compound_stmts.xhtml#try) 語句的描述以及 [raise 語句](simple_stmts.xhtml#raise) 小節中對 [`raise`](simple_stmts.xhtml#raise) 語句的描述。 腳注 [1](#id1)出現這樣的限制是由于通過這些操作執行的代碼在模塊被編譯的時候并不可用。 ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](import.xhtml "5. 導入系統") | - [上一頁](datamodel.xhtml "3. 數據模型") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看