23-變量的引用以及是否可變

01. 變量的引用

  • 變量 和 數據 都是保存在 內存 中的python

  • Python函數 的 參數傳遞 以及 返回值 都是靠 引用 傳遞的算法

1.1 引用的概念

Python函數

  • 變量數據 是分開存儲的spa

  • 數據 保存在內存中的一個位置code

  • 變量 中保存着數據在內存中的地址blog

  • 變量記錄數據的地址,就叫作 引用生命週期

  • 使用 id() 函數能夠查看變量中保存數據所在的 內存地址內存

注意:若是變量已經被定義,當給一個變量賦值的時候,本質上是 修改了數據的引用utf-8

  • 變量 再也不 對以前的數據引用開發

  • 變量 改成 對新賦值的數據引用

函數的參數和返回值的傳遞

Python 中,函數的 實參/返回值 都是是靠 引用 來傳遞來的

 1 #!/usr/bin/env python3
 2 # coding=utf-8
 3 
 4 
 5 def test(num):
 6     print('test--%d %x' % (num, id(num)))
 7     result = 100
 8 
 9     print('test--%d %x' % (result, id(result)))
10     return result
11 
12 
13 def main():
14     a = 10
15     print('main--%d %x' % (a, id(a)))
16 
17     r = test(a)
18     print('main--%d %x' % (r, id(r)))
19 
20 
21 if __name__ == '__main__':
22     main()

main--10 a69f20
test--10 a69f20
test--100 a6aa60
main--100 a6aa60

 

02. 可變和不可變類型

  • 不可變類型,內存中的數據不容許被修改:

    • 數字類型 int, bool, float, complex, long(2.x)

    • 字符串 str

    • 元組 tuple

  • 可變類型,內存中的數據能夠被修改:

    • 列表 list

    • 字典 dict

注意:字典的 key 只能使用不可變類型的數據

注意

  1. 可變類型的數據變化,是經過 方法 來實現的

  2. 若是給一個可變類型的變量,賦值了一個新的數據,引用會修改

    • 變量 再也不 對以前的數據引用

    • 變量 改成 對新賦值的數據引用

哈希 (hash)

  • Python 中內置有一個名字叫作 hash(o) 的函數

    • 接收一個 不可變類型 的數據做爲 參數

    • 返回 結果是一個 整數

  • 哈希 是一種 算法,其做用就是提取數據的 特徵碼(指紋)

    • 相同的內容 獲得 相同的結果

    • 不一樣的內容 獲得 不一樣的結果

  • Python 中,設置字典的 鍵值對 時,會首先對 key 進行 hash 已決定如何在內存中保存字典的數據,以方便 後續 對字典的操做:增、刪、改、查

    • 鍵值對的 key 必須是不可變類型數據

    • 鍵值對的 value 能夠是任意類型的數據

03. 局部變量和全局變量

  • 局部變量 是在 函數內部 定義的變量,只能在函數內部使用

  • 全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),全部函數 內部 均可以使用這個變量

提示:在其餘的開發語言中,大多 不推薦使用全局變量 —— 可變範圍太大,致使程序很差維護!

3.1 局部變量

  • 局部變量 是在 函數內部 定義的變量,只能在函數內部使用

  • 函數執行結束後,函數內部的局部變量,會被系統回收

  • 不一樣的函數,能夠定義相同的名字的局部變量,可是 彼此之間 不會產生影響

局部變量的做用

  • 在函數內部使用,臨時 保存 函數內部須要使用的數據

局部變量的生命週期

  • 所謂 生命週期 就是變量從 被建立被系統回收 的過程

  • 局部變量函數執行時 纔會被建立

  • 函數執行結束後 局部變量 被系統回收

  • 局部變量在生命週期 內,能夠用來存儲 函數內部臨時使用到的數據

3.2 全局變量

  • 全局變量 是在 函數外部定義 的變量,全部函數內部均可以使用這個變量

注意:函數執行時,須要處理變量時 會:

  1. 首先 查找 函數內部 是否存在 指定名稱 的局部變量若是有,直接使用

  2. 若是沒有,查找 函數外部 是否存在 指定名稱 的全局變量若是有,直接使用

  3. 若是尚未,程序報錯!

1) 函數不能直接修改 全局變量的引用

  • 全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),全部函數 內部 均可以使用這個變量

提示:在其餘的開發語言中,大多 不推薦使用全局變量 —— 可變範圍太大,致使程序很差維護!

  • 在函數內部,能夠 經過全局變量的引用獲取對應的數據

  • 可是,不容許直接修改全局變量的引用 —— 使用賦值語句修改全局變量的值

注意:只是在函數內部定義了一個局部變量而已,只是變量名相同 —— 在函數內部不能直接修改全局變量的值

2) 在函數內部修改全局變量的值

  • 若是在函數中須要修改全局變量,須要使用 global 進行聲明

3) 全局變量定義的位置

  • 爲了保證全部的函數都可以正確使用到全局變量,應該 將全局變量定義在其餘函數的上方

相關文章
相關標籤/搜索