1. 程式人生 > >Python之變數

Python之變數

目標

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

01. 變數的引用

  • 變數 和 資料 都是儲存在 記憶體 中的
  • 在 Python 中 函式 的 引數傳遞 以及 返回值 都是靠 引用 傳遞的

1.1 引用的概念

在 Python 中

  • 變數 和 資料 是分開儲存的
  • 資料 儲存在記憶體中的一個位置
  • 變數 中儲存著資料在記憶體中的地址
  • 變數 中 記錄資料的地址,就叫做 引用
  • 使用 id() 函式可以檢視變數中儲存資料所在的 記憶體地址

注意:如果變數已經被定義,當給一個變數賦值的時候,本質上是 修改了資料的引用

  • 變數 不再 對之前的資料引用
  • 變數 改為 對新賦值的資料引用

1.2 變數引用 的示例

在 Python 中,變數的名字類似於 便籤紙 貼在 資料 上

  • 定義一個整數變數 a,並且賦值為 1
程式碼 圖示
a = 1 004_a1tag
  • 將變數 a 賦值為 2
程式碼 圖示
a = 2 005_a2tag           
  • 定義一個整數變數 b,並且將變數 a 的值賦值給 b
程式碼 圖示
b = a 006_ab2tag

變數 b 是第 2 個貼在數字 2 上的標籤

  

 

1.3 函式的引數和返回值的傳遞

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

def test(num):

    print("%d 在函式內部的記憶體地址是 %d" % (num, id(num)))


a = 2
print("呼叫函式前記憶體的地址是 %d" % id(a))

test(a)

根據執行結果可以看出Python在函式傳遞時傳遞的不是值而是引用(地址) 

def test(num):

    print("%d 在函式內部的記憶體地址是 %d" % (num, id(num)))
    result = 10
    print("返回值 %d 在記憶體中的地址是 %d" % (result, id(result)))
    return result


a = 2
print("呼叫函式前記憶體的地址是 %d" % id(a))

# 在Python中如果函式有返回值,但是沒有定義變數接收
# 程式是不會報錯的,但無法獲取返回值
r = test(a)
print("%d 的記憶體地址是 %d" % (r, id(r)))

從結果可以看出在Python中函式返回值返回的也是引用(地址)而不是值 

02. 可變和不可變型別

  • 不可變型別,記憶體中的資料不允許被修改:

    • 數字型別 intboolfloatcomplexlong(2.x)
    • 字串 str
    • 元組 tuple
  • 可變型別,記憶體中的資料可以被修改:

    • 列表 list
    • 字典 dict

 

不可變型別一旦定義也就是在記憶體中分配了記憶體空間之後並且在記憶體空間指定了內容之後就不允許在修改記憶體空間中的內容

可變型別在記憶體中分配了記憶體空間並且指定了內容後 ,我們仍可以通過呼叫方法來修改該記憶體空間中的內容(該記憶體地址不發生變化)

當我們使用賦值語句給一個列表變數賦予新值的時候是在改變變數的引用地址,而不是在修改之前的內容,要想改變之前的內容就要通過呼叫方法來修改之前的內容