13 變數進階
阿新 • • 發佈:2022-03-03
變數進階
學習內容
- 變數的引用
- 可變和不可變型別
- 區域性變數和全域性變數
01.變數的引用
- 變數和資料都是儲存在記憶體中
- 在python中函式的引數傳遞以及返回值都是靠引用傳遞
1.1 引用的概念
在Python中
- 變數和資料是分開儲存的
- 資料儲存在記憶體中的一個位置
- 變數中儲存著資料在記憶體中的地址
- 變數中記錄資料的地址,就叫做引用
- 使用
id()函式
可以檢視變數中儲存資料所在的記憶體地址
注意:如果變數已經被定義,當給一個變數賦值的時候,本質上是修改了資料的引用
- 變數不再對之前的資料引用
- 變數改為對新賦值的資料引用
1.2 函式的引數和返回值的傳遞
在Python中,函式的實參/返回值
def test(num): print("在函式內部 %d 對應的記憶體地址是 %d " % (num,id(num))) # 1)定義一個字串變數 result ="hello" print("函式要返回資料的記憶體地址是 %d " % id(result)) # 2) 將字串變數返回 return result # 1. 定義一個數字的變數 a=10 # 資料的地址本質就是一個數字 print("a 變數儲存資料的記憶體地址是 %d "% id(a)) # 2. 呼叫test函式,本質上傳遞的是實參儲存資料的引用,而不是實參儲存的數字 # 注意:如果函式有返回值,但是沒有定義變數接收 # 程式不會報錯,但是無法獲得返回結果 r= test(a) print("r 變數儲存資料的記憶體地址是 %d "% id(r))
程式結果
02.可變和不可變型別
- 不可變型別,記憶體中的資料不允許被修改:
- 數字型別 int bool float complex long(2.x)
- 字串 str
- 元組 tuple
- 可變型別。記憶體中的資料可以被修改:
- 列表 list
- 字典 dict
程式執行結果:
從結果可以看出來,修改列表和字典後,其記憶體地址均不改變!
雜湊(hash)
- Python中內建有一個名字叫做hash(o)的函式
- 接收一個不可變型別的資料作為引數
- 返回結果是一個整數
- 雜湊是—種演算法,其作用就是提取資料的特徵碼(指紋)。
- 相同的內容得到相同的結果
- 不同的內容得到不同的結果
- 在Python中,設定字典的鍵值對時,會首先對
key
進行hash
已決定如何在記憶體中儲存字典的資料,以方便後續對字典的操作:增、刪、改、查- 鍵值對的key必須是不可變型別資料
- 鍵值對的value 可以是任意型別的資料
03. 區域性變數和全域性變數
- 區域性變數是在函式內部定義的變數,只能在函式內部使用
- 全域性變數是在函式外部定義的變數(沒有定義在某一個函式內),所有函式 內部都可以使用這個變數
3.1 區域性變數
- 區域性變數是在函式內部定義的變數,只能在函式內部使用
- 函式執行結束後,函式內部的區域性變數,會被系統回收
- 不同的函式,可以定義相同的名字的區域性變數,但是彼此之間不會產生影響
區域性變數的作用
- 在函式內部使用,臨時儲存函式內部需要使用的資料
區域性變數的生命週期
- 所謂生命週期就是變數從被建立到被系統回收的過程
- 區域性變數在函式執行時才會被建立
- 函式執行結束後區域性變數被系統回收
- 區域性變數在生命週期內,可以用來儲存函式內部臨時使用到的資料
3.2 全域性變數
- 全域性變數是在函式外部定義的變數,所有函式內部都可以使用這個變數
注意:函式執行時,需要處理變數時會:
-
首先查詢函式內部是否存在指定名稱的區域性變數,如果有,直接使用
-
如果沒有,查詢函式外部是否存在指定名稱的全域性變數,如果有,直接使用
-
如果還沒有,程式報錯!
1)函式不能直接修改全域性變數的引用
-
全域性變數是在函式外部定義的變數(沒有定義在某一個函式內),所有函式內部都可以使用這個變數
-
在函式內部,可以通過全域性變數的引用獲取對應的資料
-
但是,不允許直接修改全域性變數的引用——使用賦值語句修改全域性變數的值
2)在函式內部修改全域性變數的值
- 如果在函式中需要修改全域性變數,需要使用
global
進行宣告
3)全域性變數定義的位置
- 為了保證所有的函式都能夠正確使用到全域性變數,應該將全域性變數定義在其他函式的上方
注意:
由於全域性變數c,是在呼叫函式之後,才定義的,在執行函式時,變數還沒有定義,所以程式會報錯!
04)全域性變數命名的建議
- 為了避免區域性變數和全域性變量出現混淆,在定義全域性變數時,有些公司會有一些開發要求,例如:
- 全域性變數名前應該增加
g_
或者gl_
的字首
提示:具體的要求格式,各公司要求可能會有些差異