函式進階5.4引用
阿新 • • 發佈:2021-12-17
一、引入
如下程式碼中,最後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]