<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 功能強大 支持多語言、二開方便! 廣告
                # 變量進階(理解) ## 目標 * 變量的引用 * 可變和不可變類型 * 局部變量和全局變量 ## 01. 變量的引用 > * 變量 和 數據 都是保存在 **內存** 中的 > * 在 `Python` 中 **函數 的 參數傳遞** 以及 **返回值** 都是靠 **引用** 傳遞的 ### 1.1 引用的概念 在 `Python` 中 * **變量** 和 **數據** 是分開存儲的 * **數據** 保存在內存中的一個位置 * **變量** 中保存著數據在內存中的地址 * **變量** 中 **記錄數據的地址**,就叫做 **引用** * 使用 `id()` 函數可以查看變量中保存數據所在的 **內存地址** > 注意:如果變量已經被定義,當給一個變量賦值的時候,本質上是 **修改了數據的引用** > > * 變量 **不再** 對之前的數據引用 > * 變量 **改為** 對新賦值的數據引用 ### 1.2 `變量引用` 的示例 在 `Python` 中,變量的名字類似于 **便簽紙** 貼在 **數據** 上 * 定義一個整數變量 `a`,并且賦值為 `1` | 代碼 | 圖示 | | :---: | :---: | | a = 1 | ![](https://pic.downk.cc/item/5e7f2bda504f4bcb046a1464.png) | * 將變量 `a` 賦值為 `2` | 代碼 | 圖示 | | :---: | :---: | | a = 2 | ![](https://pic.downk.cc/item/5e7f2bda504f4bcb046a146c.png)![](https://pic.downk.cc/item/5e7f2bda504f4bcb046a1469.png) | * 定義一個整數變量 `b`,并且將變量 `a` 的值賦值給 `b` | 代碼 | 圖示 | | :---: | :---: | | b = a | ![](https://pic.downk.cc/item/5e7f2bda504f4bcb046a146f.png) | > 變量 `b` 是第 2 個貼在數字 `2` 上的標簽 ### 1.3 函數的參數和返回值的傳遞 在 `Python` 中,函數的 **實參**/**返回值** 都是是靠 **引用** 來傳遞來的 ```python def test(num): print("-" * 50) print("%d 在函數內的內存地址是 %x" % (num, id(num))) result = 100 print("返回值 %d 在內存中的地址是 %x" % (result, id(result))) print("-" * 50) return result a = 10 print("調用函數前 內存地址是 %x" % id(a)) r = test(a) print("調用函數后 實參內存地址是 %x" % id(a)) print("調用函數后 返回值內存地址是 %x" % id(r)) ``` ## 02. 可變和不可變類型 * **不可變類型**,內存中的數據不允許被修改: * 數字類型 `int`, `bool`, `float`, `complex`, `long(2.x)` * 字符串 `str` * 元組 `tuple` * **可變類型**,內存中的數據可以被修改: * 列表 `list` * 字典 `dict` ```python a = 1 a = "hello" a = [1, 2, 3] a = [3, 2, 1] ``` ```python demo_list = [1, 2, 3] print("定義列表后的內存地址 %d" % id(demo_list)) demo_list.append(999) demo_list.pop(0) demo_list.remove(2) demo_list[0] = 10 print("修改數據后的內存地址 %d" % id(demo_list)) demo_dict = {"name": "小明"} print("定義字典后的內存地址 %d" % id(demo_dict)) demo_dict["age"] = 18 demo_dict.pop("name") demo_dict["name"] = "老王" print("修改數據后的內存地址 %d" % id(demo_dict)) ``` > 注意:字典的 `key` **只能使用不可變類型的數據** **注意** 1. **可變類型**的數據變化,是通過 **方法** 來實現的 2. 如果給一個可變類型的變量,賦值了一個新的數據,**引用會修改** * 變量 **不再** 對之前的數據引用 * 變量 **改為** 對新賦值的數據引用 ### 哈希 `(hash)` * `Python` 中內置有一個名字叫做 `hash(o)` 的函數 * 接收一個 **不可變類型** 的數據作為 **參數** * **返回** 結果是一個 **整數** * `哈希` 是一種 **算法**,其作用就是提取數據的 **特征碼(指紋)** * **相同的內容** 得到 **相同的結果** * **不同的內容** 得到 **不同的結果** * 在 `Python` 中,設置字典的 **鍵值對** 時,會首先對 `key` 進行 `hash` 已決定如何在內存中保存字典的數據,以方便 **后續** 對字典的操作:**增、刪、改、查** * 鍵值對的 `key` 必須是不可變類型數據 * 鍵值對的 `value` 可以是任意類型的數據 ## 03. 局部變量和全局變量 * **局部變量** 是在 **函數內部** 定義的變量,**只能在函數內部使用** * **全局變量** 是在 **函數外部定義** 的變量(沒有定義在某一個函數內),**所有函數** 內部 **都可以使用這個變量** > 提示:在其他的開發語言中,大多 **不推薦使用全局變量** —— 可變范圍太大,導致程序不好維護! ### 3.1 局部變量 * **局部變量** 是在 **函數內部** 定義的變量,**只能在函數內部使用** * 函數執行結束后,**函數內部的局部變量,會被系統回收** * 不同的函數,可以定義相同的名字的局部變量,但是 **彼此之間** 不會產生影響 #### 局部變量的作用 * 在函數內部使用,**臨時** 保存 **函數內部需要使用的數據** ```python def demo1(): num = 10 print(num) num = 20 print("修改后 %d" % num) def demo2(): num = 100 print(num) demo1() demo2() print("over") ``` #### 局部變量的生命周期 * 所謂 **生命周期** 就是變量從 **被創建** 到 **被系統回收** 的過程 * **局部變量** 在 **函數執行時** 才會被創建 * **函數執行結束后** 局部變量 **被系統回收** * **局部變量在生命周期** 內,可以用來存儲 **函數內部臨時使用到的數據** ### 3.2 全局變量 * **全局變量** 是在 **函數外部定義** 的變量,所有函數內部都可以使用這個變量 ```python # 定義一個全局變量 num = 10 def demo1(): print(num) def demo2(): print(num) demo1() demo2() print("over") ``` **注意**:函數執行時,**需要處理變量時** 會: 1. **首先** 查找 **函數內部** 是否存在 **指定名稱 的局部變量**,**如果有,直接使用** 2. 如果沒有,查找 **函數外部** 是否存在 **指定名稱 的全局變量**,**如果有,直接使用** 3. 如果還沒有,程序報錯! #### 1) 函數不能直接修改 `全局變量的引用` * **全局變量** 是在 **函數外部定義** 的變量(沒有定義在某一個函數內),**所有函數** 內部 **都可以使用這個變量** > 提示:在其他的開發語言中,大多 **不推薦使用全局變量** —— 可變范圍太大,導致程序不好維護! * 在函數內部,可以 **通過全局變量的引用獲取對應的數據** * 但是,**不允許直接修改全局變量的引用** —— 使用賦值語句修改全局變量的值 ```python num = 10 def demo1(): print("demo1" + "-" * 50) # 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已 num = 100 print(num) def demo2(): print("demo2" + "-" * 50) print(num) demo1() demo2() print("over") ``` > 注意:只是在函數內部定義了一個局部變量而已,只是變量名相同 —— 在函數內部不能直接修改全局變量的值 #### 2) 在函數內部修改全局變量的值 * 如果在函數中需要修改全局變量,需要使用 `global` 進行聲明 ```python num = 10 def demo1(): print("demo1" + "-" * 50) # global 關鍵字,告訴 Python 解釋器 num 是一個全局變量 global num # 只是定義了一個局部變量,不會修改到全局變量,只是變量名相同而已 num = 100 print(num) def demo2(): print("demo2" + "-" * 50) print(num) demo1() demo2() print("over") ``` #### 3) 全局變量定義的位置 * 為了保證所有的函數都能夠正確使用到全局變量,應該 **將全局變量定義在其他函數的上方** ```python a = 10 def demo(): print("%d" % a) print("%d" % b) print("%d" % c) b = 20 demo() c = 30 ``` **注意** * 由于全局變量 c,是在調用函數之后,才定義的,在執行函數時,變量還沒有定義,所以程序會報錯! **代碼結構示意圖如下** ![](https://pic.downk.cc/item/5e7f2bda504f4bcb046a1460.png) #### 4) 全局變量命名的建議 * 為了避免局部變量和全局變量出現混淆,在定義全局變量時,有些公司會有一些開發要求,例如: * 全局變量名前應該增加 `g_` 或者 `gl_` 的前綴 > 提示:具體的要求格式,各公司要求可能會有些差異
                  <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>

                              哎呀哎呀视频在线观看