變量 和 數據 都是保存在 內存 中的python
在
Python
中 函數 的 參數傳遞 以及 返回值 都是靠 引用 傳遞的算法
在 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
不可變類型,內存中的數據不容許被修改:
數字類型 int
, bool
, float
, complex
, long(2.x)
字符串 str
元組 tuple
可變類型,內存中的數據能夠被修改:
列表 list
字典 dict
注意:字典的
key
只能使用不可變類型的數據
注意
可變類型的數據變化,是經過 方法 來實現的
若是給一個可變類型的變量,賦值了一個新的數據,引用會修改
變量 再也不 對以前的數據引用
變量 改成 對新賦值的數據引用
(hash)
Python
中內置有一個名字叫作 hash(o)
的函數
接收一個 不可變類型 的數據做爲 參數
返回 結果是一個 整數
哈希
是一種 算法,其做用就是提取數據的 特徵碼(指紋)
相同的內容 獲得 相同的結果
不一樣的內容 獲得 不一樣的結果
在 Python
中,設置字典的 鍵值對 時,會首先對 key
進行 hash
已決定如何在內存中保存字典的數據,以方便 後續 對字典的操做:增、刪、改、查
鍵值對的 key
必須是不可變類型數據
鍵值對的 value
能夠是任意類型的數據
局部變量 是在 函數內部 定義的變量,只能在函數內部使用
全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),全部函數 內部 均可以使用這個變量
提示:在其餘的開發語言中,大多 不推薦使用全局變量 —— 可變範圍太大,致使程序很差維護!
局部變量 是在 函數內部 定義的變量,只能在函數內部使用
函數執行結束後,函數內部的局部變量,會被系統回收
不一樣的函數,能夠定義相同的名字的局部變量,可是 彼此之間 不會產生影響
在函數內部使用,臨時 保存 函數內部須要使用的數據
所謂 生命週期 就是變量從 被建立 到 被系統回收 的過程
局部變量 在 函數執行時 纔會被建立
函數執行結束後 局部變量 被系統回收
局部變量在生命週期 內,能夠用來存儲 函數內部臨時使用到的數據
全局變量 是在 函數外部定義 的變量,全部函數內部均可以使用這個變量
注意:函數執行時,
首先 查找 函數內部 是否存在 指定名稱 的局部變量,若是有,直接使用
若是沒有,查找 函數外部 是否存在 指定名稱 的全局變量,若是有,直接使用
若是尚未,程序報錯!
全局變量的引用
全局變量 是在 函數外部定義 的變量(沒有定義在某一個函數內),全部函數 內部 均可以使用這個變量
提示:在其餘的開發語言中,大多 不推薦使用全局變量 —— 可變範圍太大,致使程序很差維護!
在函數內部,能夠 經過全局變量的引用獲取對應的數據
可是,不容許直接修改全局變量的引用 —— 使用賦值語句修改全局變量的值
若是在函數中須要修改全局變量,須要使用 global
進行聲明
爲了保證全部的函數都可以正確使用到全局變量,應該 將全局變量定義在其餘函數的上方