<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Python 命名空間和范圍 > 原文: [https://www.programiz.com/python-programming/namespace](https://www.programiz.com/python-programming/namespace) #### 在本教程中,您將了解名稱空間,從名稱到對象的映射以及變量的范圍。 ## Python 中的名稱是什么? 如果您曾經讀過“Python 之禪”(Python 解釋器中的類型`import this`),則最后一行指出,**命名空間是一個很棒的主意-讓我們做更多的事情!** 那么這些神秘的命名空間是什么? 讓我們首先看看名字是什么。 名稱(也稱為標識符)只是賦予對象的名稱。 Python 中的所有內容都是[對象](https://www.programiz.com/python-programming/class)。 名稱是訪問基礎對象的一種方式。 例如,當我們執行分配`a = 2`時,`2`是存儲在內存中的對象,而`a`是與之關聯的名稱。 我們可以通過[內置函數](https://www.programiz.com/python-programming/built-in-function) `id()`獲得某個對象的地址(在 RAM 中)。 讓我們看看如何使用它。 ```py # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a)) ``` **輸出** ```py id(2) = 9302208 id(a) = 9302208 ``` 在這里,兩者都引用相同的對象`2`,因此它們具有相同的`id()`。 讓我們做些有趣的事情。 ```py # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2)) ``` **輸出**: ```py id(a) = 9302208 id(a) = 9302240 id(3) = 9302240 id(b) = 9302208 id(2) = 9302208 ``` 上述步驟序列中發生了什么? 讓我們用一個圖來解釋一下: ![Memory diagram of a variable](https://img.kancloud.cn/76/63/7663225d84a42c977643d50108ec7a60_631x220.png "Memory Diagram") Python 中變量的內存圖 最初,創建一個對象`2`并將其與名稱`b`關聯,當我們執行`a = a+1`時,將創建一個新的對象`3`,而現在將`a`與這個對象關聯起來。 注意,`id(a)`和`id(3)`具有相同的值。 此外,當執行`b = 2`時,新名稱`b`與先前的對象`2`相關聯。 這是有效的,因為 Python 不必創建新的重復對象。 名稱綁定的這種動態特性使 Python 功能強大。 名稱可以引用任何類型的對象。 ```py >>> a = 5 >>> a = 'Hello World!' >>> a = [1,2,3] ``` 所有這些都是有效的,`a`將引用不同實例中的三種不同類型的對象。 [函數](https://www.programiz.com/python-programming/function)也是對象,因此名稱也可以引用它們。 ```py def printHello(): print("Hello") a = printHello a() ``` **輸出**: ```py Hello ``` `a`可以使用相同的名稱,我們可以使用該名稱來調用該函數。 * * * ## Python 中的命名空間是什么? 現在我們了解了名稱是什么,我們可以繼續進行命名空間的概念。 簡而言之,名稱空間是名稱的集合。 在 Python 中,您可以將名稱空間想象為已定義的每個名稱到對應對象的映射。 不同的名稱空間可以在給定時間共存,但是完全隔離。 當我們啟動 Python 解釋器時,將創建一個包含所有內置名稱的名稱空間,并且只要該解釋器運行,該名稱空間就會存在。 這就是為什么內置`id()`,`print()`等函數始終可以從程序的任何部分使用的原因。 每個[模塊](https://www.programiz.com/python-programming/modules)創建其自己的全局名稱空間。 這些不同的名稱空間是隔離的。 因此,不同模塊中可能存在的相同名稱不會沖突。 模塊可以具有各種函數和類。 調用函數時會創建一個本地名稱空間,該名稱空間中定義了所有名稱。 與類相似。 下圖可能有助于闡明這一概念。 ![Nested Namespaces in Python Programming](https://img.kancloud.cn/1d/2d/1d2d02d781fe2e0212e24d1d38a0b330_452x430.png "Different Nested Namespaces") Python 中不同名稱空間的圖 * * * ## Python 變量范圍 盡管定義了各種唯一的名稱空間,但我們可能無法從程序的每個部分訪問它們。 范圍的概念開始起作用。 范圍是程序的一部分,從那里可以直接訪問名稱空間而無需任何前綴。 在任何給定時刻,至少有三個嵌套作用域。 1. 具有局部名稱的當前函數的范圍 2. 具有全局名稱的模塊的范圍 3. 具有內置名稱的最外部作用域 在函數內部進行引用時,將在本地名稱空間中搜索名稱,然后在全局名稱空間中搜索,最后在內置名稱空間中搜索。 如果另一個函數內有一個函數,則新作用域嵌套在本地作用域內。 * * * ## Python 范圍和命名空間的示例 ```py def outer_function(): b = 20 def inner_func(): c = 30 a = 10 ``` 在這里,變量`a`在全局命名空間中。 變量`b`在`outer_function()`的本地名稱空間中,而`c`在`inner_function()`的嵌套本地名稱空間中。 當我們在`inner_function()`中時,`c`對我們來說是本地的,`b`是非本地的,`a`是全局的。 我們可以讀取`c`并為其分配新值,但只能從`inner_function()`讀取`b`和`a`。 如果我們嘗試為`b`賦值,則會在本地名稱空間中創建一個與非本地`b`不同的新變量`b`。 當我們為`a`分配一個值時,也會發生同樣的事情。 但是,如果我們將`b`為全局變量,則所有引用和賦值都將轉到全局變量。 同樣,如果我們想重新綁定變量`b`,則必須將其聲明為非本地變量。 以下示例將進一步闡明這一點。 ```py def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a) ``` 如您所見,該程序的輸出為 ```py a = 30 a = 20 a = 10 ``` 在此程序中,在單獨的命名空間中定義了三個不同的變量`a`并進行了相應的訪問。 在以下程序中, ```py def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a) ``` 程序的輸出是。 ```py a = 30 a = 30 a = 30 ``` 在這里,由于使用了關鍵字`global`,所有引用和分配都指向全局`a`。
                  <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>

                              哎呀哎呀视频在线观看