1. 程式人生 > 其它 >13 變數進階

13 變數進階

變數進階

學習內容

  • 變數的引用
  • 可變和不可變型別
  • 區域性變數和全域性變數

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. 如果沒有,查詢函式外部是否存在指定名稱的全域性變數,如果有,直接使用

  3. 如果還沒有,程式報錯!

1)函式不能直接修改全域性變數的引用

  • 全域性變數是在函式外部定義的變數(沒有定義在某一個函式內),所有函式內部都可以使用這個變數

  • 在函式內部,可以通過全域性變數的引用獲取對應的資料

  • 但是,不允許直接修改全域性變數的引用——使用賦值語句修改全域性變數的值

2)在函式內部修改全域性變數的值

  • 如果在函式中需要修改全域性變數,需要使用global進行宣告

3)全域性變數定義的位置

  • 為了保證所有的函式都能夠正確使用到全域性變數,應該將全域性變數定義在其他函式的上方

注意:

由於全域性變數c,是在呼叫函式之後,才定義的,在執行函式時,變數還沒有定義,所以程式會報錯!

04)全域性變數命名的建議

  • 為了避免區域性變數和全域性變量出現混淆,在定義全域性變數時,有些公司會有一些開發要求,例如:
  • 全域性變數名前應該增加g_或者gl_的字首

提示:具體的要求格式,各公司要求可能會有些差異