前言
這篇我們要來研究 python 裡面,function 內記憶體位置的變化,
研究這點重要的原因在於,
如果我們能清楚的了解 python 內記憶體位置是如何變化的,
那對於我們之後是否拿到正確的內容會有絕對的幫助。
範例程式碼
def test(a):
print("in func", id(a))
a=10000
print("in func", id(a))
return a
print("------ test 1 ------")
a=2000
print(a, id(a))
print("------ test 2 ------")
test(a)
print(a, id(a))
print("------ test 3 ------")
a=test(a)
print(a, id(a))
結果
------ test 1 ------
2000 140187642266992
------ test 2 ------
in func 140187642266992
in func 140187642266672
2000 140187642266992
------ test 3 ------
in func 140187642266992
in func 140187642266672
10000 140187642266672
說明
測試一
這是我們的對照組,主要是觀察 a 現在的記憶體位置
我們得到 a 位於記憶體 「140187642266992」 的地方
測試二
我們要測試的是,進入 function 的 a,
與離開 function 的 a,記憶體位置是否相同。
在 function 中,剛進入時的 a 為 「140187642266992」
而當我我們改變了 a 的值之後,a 的記憶體位置指向 「140187642266672」(不一樣)
這邊我們得知了一件事情,修改過後的 a,
記憶體位置會指向不同的地方。
但出了 function 之後, a 又變回記憶體 「140187642266992」 的地方,且顯示原來的值「2000」
測試三
在測試二中,我們並沒有指派「在 function 外的 a 更新值」,
我們在實驗中進行指派。
在 function 中,剛進入時的 a 為 「140187642266992」
而當我我們改變了 a 的值之後,a 的記憶體位置指向 「140187642266672」(不一樣)
這邊我們得知了一件事情,修改過後的 a,
記憶體位置會指向不同的地方。
但出了 function 之後, a 變到記憶體 「140187642266672」 的地方,且值也被改為「10000」
注意!!! 「140187642266672」居然與 function 內被改動過的 a 值相同!!!
我們來給這件事情做一個解釋。
結論與說明
我們觀察上面三個例子,我們可以得到
python 中,其實每一個變數基本上都像是一個「指標 (pointer)」,
只是不像 C++ 一樣,還特別需要多一個「*」代表指標。
從測試二、測試三的比較中,
我們發現其實 2000、10000,這兩個值早已固定在記憶體位置中的某個地方。
也就是說,其實是 a 去改變了他指向的記憶體位置,造成了值的改變。
所以 python 傳的其實是指標,而當這個指標被改動的時候,
這個「指向的值(與值對應的記憶體位置)」,不會跟著被改動!
2000、10000都是「固定的記憶體位置」。被改變的只有「a 指向的記憶體位置」。