【Python】python 小知識 – 記憶體位置與 function 關係之研究 (call by value? call by reference?)

➣ Reading Time: 6 minutes

前言

這篇我們要來研究 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 指向的記憶體位置」。

Reference

⭐Python 基礎用法 相關文章整理⭐:
1.【Python】python list 清除, 移除內容元素 remove, pop, del, clear相關用法整理 sample code (內含範例程式碼)
2.【Python】寫模組 module、package 總整理 Importing files from different folder
3.【Python】python assert (斷言) 用法 sample code (內含範例程式碼)
4.【Python】python 一行 if else 語法 (one line if else) sample code (內含範例程式碼)
5.【Python】lambda 與 def function 使用方法與比較整理(內含範例程式碼)
6.【Python】python map 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
7.【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python print 變數的值 & 變數名稱 方法總整理
2.【Python】python string format str.format 總整理
⭐Python 檔案處理 相關文章整理⭐:
1.【Python】python 開關檔範例 與 程式模板 with open / file open sample code
2.【Python】取出檔案名稱 (含副檔名、不含副檔名) os path basename split 取出 檔名 路徑 不要副檔名 sample code
3.【Python】在 python 中利用 os.chmod 更改檔案的權限 chmod 777
4.【Python】利用 shutil 來複製檔案 shutil copy file
5.【Python】python 建立資料夾範例 mkdir os.makedirs() sample code
6.【Python】python 移除資料夾範例 rmdir shutil.rmtree() sample code
7.【Python】確認檔案是否存在 os.path.isfile / 確認資料夾是否存在 os.path.isdir sample code is folder / file exist
⭐Python 系統偵測 相關文章整理⭐:
1.【Python】python pyinotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
2.【Python】python 利用 argparse 使程式執行時可帶參數 (內附範例程式碼) sample code
⭐Python 平行運算 相關文章整理⭐:
1.【Python】threading – 建立多執行緒來執行程式 (內含範例程式碼) sample code
2.【Python】multiprocessing – 用多核心來執行程式 (內含範例程式碼) sample code
3.【Python】multiprocessing pool, map, apply_async – 用多核心來執行程式並取得結果 (內含範例程式碼) sample code
4.【Python】python thread multiprocess 比較總整理
5.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)
⭐Python 測試程式 相關文章整理⭐:
1.【Python】python 測試程式 – 利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)
2.【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)
⭐Python Chatbot 相關文章整理⭐:
1.【Chatbot】(全圖文說明) LINE Developers bot 機器人註冊與設定
2.【Chatbot】(全圖文說明) ngrok 本地伺服器設定方法 – LINE bot local server
3.【Chatbot】Dialogflow API 串接 python 的方法 (內含範例程式碼)
4.【Chatbot】[講義分享] 手把手實作line機器人 (linebot API 運用)
⭐Python Google Colab (Colaboratory) 相關文章整理⭐:
1.【Colab】Python colab 上傳檔案的方法 (內含範例程式碼) upload files
2.【Colab】Python colab 連接 google 雲端硬碟取用資料 (內含範例程式碼) mount google drive
⭐Python 其他筆記 相關文章整理⭐:
1.【Python】anaconda 更新 (upgrade) python 3.8 版本筆記
2.【Sublime】Sublime 將縮排 “tab” 改成 4格空白 的方法 (圖文說明) sublime indent 4 spaces
3.【Sublime】Python 縮排小技巧 (很爛但實用) 快速將 tab 改成「4格空白」的方法
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
預設圖片
Howard Weng
我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
文章: 391

★留個言吧!內容有誤或想要補充也歡迎與我討論!