1. 程式人生 > 其它 >函式進階5.4引用

函式進階5.4引用

一、引入

如下程式碼中,最後b的值為多少?

>>> a = 1
>>> b = a
>>> b
1
>>> a = 2
>>> a
2

  

如下程式碼中,最後b的值為多少?

>>> a = [1, 2]
>>> b = a
>>> b
[1, 2]
>>> a.append(3)
>>> a
[1, 2, 3]

  

二、引用是什麼

引用:就是地址

那地址是什麼呢?可以理解為存放資料的空間在記憶體中的編號

例如

a = 100

  

怎樣知道它的地址呢?

id(a)

  

可以直接將上述的結果列印

print(id(a))

  

執行結果(可能不相同)

4347271232

  

當我們知道了原來引用就是地址之後,再來看

a = [1, 2]

  

我們可以用id(a)後去它的地址

a = [1, 2]
print(id(a))  # 獲取變數儲存的引用(地址)是多少

  

接下來定義變數b且賦值

a = [1, 2]
print(id(a))  # 獲取變數儲存的引用(地址)是多少

b = a

  

此時我們輸出變數b的引用

a = [1, 2]
print(id(a))

b = a
print(id(b))

  

執行如上程式碼,如下(可能不相同)

4558971360
4558971360

  

這說明,此時變數a、b儲存的引用都是相同的

由此我們可以得出一個結論:Python中的變數並不是真正儲存資料,而是儲存的資料所在記憶體中的地址,我們一般稱之為引用

用圖來表示如下

既然變數a、b都指向同一個列表,那麼接下來

a.apend(3)

  

此時變數a、b指向的同一個列表中多了一個數據,即此時列表為[1, 2, 3]

所以a、b此時用print輸出相同的結果

三、賦值運算子=

賦值運算子=,之前為了更好的理解變數,把a=100理解為變數a中存放了100,事實上變數a儲存是100的引用

也就是說:在Python中只要用=那麼就表示=左邊的變數儲存了一個新的引用

大白話講:就是=左邊的變數指向了右邊的資料

想想下面的程式碼執行的結果是什麼?

a = [1, 2]
b = a
b.append(3)
b = [100, 200, 300]

print(b)

  

執行結果

[100, 200, 300]

  

而不是

[1, 2, 3]

  

說明

四、引用當做實參

Python中呼叫函式時,傳遞實參實際上都是是引用,即傳遞的都是地址

只要是傳遞的引用,那麼也就是說在函式中是可以直接對指向的資料進行修改

def test(p):
    # 此時變數p也指向nums指向的列表
    p.append(44)
    print("在函式test中,p=", p)


nums = [11, 22, 33]
print("呼叫test函式之前,nums=", nums)
test(nums)  # 此時將列表的引用當做了實參進行傳遞
print("呼叫test函式之前,nums=", nums)

  

執行結果

呼叫test函式之前,nums= [11, 22, 33]
在函式test中,p= [11, 22, 33, 44]
呼叫test函式之前,nums= [11, 22, 33, 44]