指標與記憶體:個人身份的連續性
系列:程式人的哲學思辨 #05/11 | 閱讀時間:25-30分鐘 | 概念:個人同一性(Personal Identity)— 記憶、連續性與自我
作者:Wina @ Code & Cogito
那個不再是我的 Git Blame
週五下午,同事丟了一段程式碼到群組裡。
「這是誰寫的?看起來像 junior 第一天寫的。」
我打開 git blame,看到那行程式碼的作者。
是我。十八個月前的我。
那個命名混亂、沒有錯誤處理、把商業邏輯和 UI 邏輯攪在一起的人——確實是我。至少 git 這麼記錄。
但我盯著那段程式碼,感到一種奇特的疏離。我不記得自己為什麼那樣寫。我不理解自己當時的思路。如果今天讓我重新寫,我會寫出完全不同的東西。
那個寫出這段程式碼的人,還是「我」嗎?
名字一樣。email 一樣。SSH key 一樣。但思考方式、技術判斷、甚至價值觀都不一樣了。如果你把十八個月前的我和現在的我放在一起做 code review,我們大概會為了架構設計吵起來。
我突然意識到,這不只是技術成長的故事。這是一個哲學問題——一個人類思考了兩千年的問題:
什麼讓一個人跨越時間仍然是「同一個人」?
你的身體每七年更換一次所有細胞。你的信念在成長中不斷修正。你的記憶在每次回想時被悄悄改寫。到底是什麼,讓你相信二十歲的你和四十歲的你是「同一個人」?
作為程式人,你其實比多數人更有裝備來思考這個問題。因為你每天都在處理身份的核心機制:指標、引用、拷貝、垃圾回收。
這是「程式人的哲學思辨」系列第五篇。讓我們用記憶體管理的語言,拆解個人同一性的千年謎題。
Let’s debug the self.
背景:程式世界裡的身份問題
Object ID:你是你的「記憶體位址」嗎?
在 Python 裡,每個物件都有一個唯一的 id()——它的記憶體位址。即使兩個物件的內容完全相同,只要它們佔據不同的記憶體位置,它們就是不同的物件。
a = {"name": "Wina", "beliefs": ["open source", "clean code"]}
b = {"name": "Wina", "beliefs": ["open source", "clean code"]}
print(a == b) # True —— 內容相同
print(a is b) # False —— 不是同一個物件
== 問的是「你們看起來一樣嗎?」(內容相等)。is 問的是「你們是同一個嗎?」(身份相同)。
這個區分看似簡單,但它對應哲學上一個根本的分歧:
數值同一性(numerical identity)——字面上是同一個實體。你就是你,不是你的複製品。就像 a is a 永遠為 True。
性質同一性(qualitative identity)——擁有完全相同的屬性。兩枚從同一模具印出的硬幣,性質上相同,但數值上是兩枚不同的硬幣。就像 a == b 可以為 True,但 a is b 為 False。
日常生活中,我們在這兩種同一性之間不斷切換。你說「我還是十年前的那個我」——用的是數值同一性。你說「我已經完全變了一個人」——用的是性質同一性的否定。
但問題是:如果你的性質全部改變了,你的數值同一性還能成立嗎?
引用與實體:你是指標,還是指標指向的東西?
在程式裡,變數名只是一個引用——一個指向某個記憶體位置的標籤。
me = Person("Wina") # 'me' 是引用,Person(...) 是實體
你的名字就像這個變數名——它是一個社會性的引用,指向那個被稱為「你」的實體。但引用可以被重新指向,實體也可以被修改。
更混亂的是:多個引用可以指向同一個實體。
developer = me
writer = me
friend = me
# 三個角色,一個人
你是同事眼中的工程師、家人眼中的兒女、朋友眼中的某種人格。這些「引用」指向同一個實體,但每個引用看到的「介面」不同。
那麼,當所有引用都看到不同的面向時,「真正的你」在哪裡?是引用的交集?還是引用之外、無法被任何單一視角完全捕捉的那個東西?
哲學家的身份戰場
關於個人同一性,哲學史上有三個主要的理論傳統。
靈魂理論——柏拉圖和笛卡兒的立場。你之所以是你,是因為你有一個不變的靈魂。身體可以衰老、記憶可以消失、性格可以改變,但靈魂始終是同一個。這像程式裡的一個永久的 id()——不管物件的屬性怎麼變,id 不會變。
身體理論——亞里斯多德的方向。你之所以是你,是因為你的身體是連續的物理實體。即使細胞更新了,身體的整體結構和物理連續性沒有斷裂。這像記憶體裡的同一個位址——即使裡面的資料被覆寫了,位址本身是連續的。
心理連續性理論——洛克的革命性主張。你之所以是你,不是因為靈魂或身體,而是因為你的記憶把過去的你和現在的你串連起來。你記得昨天的自己,昨天的自己記得前天的自己,這條記憶鏈構成了你的身份。
洛克的理論對程式人來說最有共鳴——因為它最像一種資料結構。身份不是一個固定的值,而是一條鏈表,每個節點連接著前一個狀態和後一個狀態。
但洛克的理論也有嚴重的漏洞。蘇格蘭哲學家里德(Thomas Reid)提出了著名的「勇敢軍官」悖論:一個老年將軍記得自己中年被授勳,中年的他記得少年時因偷蘋果被鞭打,但老年的他不記得少年偷蘋果的事。按照洛克的理論,將軍和軍官是同一人,軍官和少年是同一人,但將軍和少年不是同一人——同一性的傳遞律被打破了。
記憶是重要的線索,但不是完美的基礎。
深入分析:從拷貝到垃圾回收
一、淺拷貝 vs. 深拷貝:複製的你算你嗎?
讓我們把身份問題推向極端。
假設有一天,技術可以完整掃描你的大腦——每一個神經元的連接、每一段記憶的編碼、每一種情緒的化學模式——然後在另一個身體裡精確重建。
這個副本醒來時,它擁有你所有的記憶、你所有的性格特質、你所有的習慣和偏好。它會認為自己就是你。
你們是同一個人嗎?
程式的答案很明確:
import copy
original = {"memories": [1, 2, 3], "personality": {"openness": 0.8}}
clone = copy.deepcopy(original)
print(original == clone) # True —— 內容完全相同
print(original is clone) # False —— 不是同一個物件
深拷貝創造了一個內容完全相同但獨立存在的新實體。從那一刻起,它們各自獨立演化。原本修改了一段記憶,副本不會跟著改變。
但如果你做的是淺拷貝:
shallow = copy.copy(original)
# 外層是新的,但內層的 list 和 dict 是共享的
original["memories"].append(4)
print(shallow["memories"]) # [1, 2, 3, 4] —— 被影響了
淺拷貝的兩個實體不完全獨立——它們共享一些深層結構。改變其中一個的深層部分,另一個也會受影響。
人的身份也有類似的「淺拷貝」層面。你和你的手足共享基因、文化背景、童年記憶。你和你的同事共享專業語言、工作脈絡、團隊經歷。這些共享的「引用」讓你們的身份不完全獨立——一方的改變可能影響另一方的自我認知。
哲學家帕菲特(Derek Parfit)在這個問題上提出了激進的觀點:也許「同一性」本身就不是最重要的。重要的是心理連續性的程度——你和過去的自己之間有多少記憶、性格、價值觀的延續。如果延續程度很高,「是不是同一個人」這個問題就不那麼重要了。
帕菲特甚至認為,執著於「我」的同一性是一種認知錯誤。就像你不會問一條河「它還是昨天的那條河嗎」——河水一直在流動,但我們依然把它當作同一條河。身份也許就是這種流動中的模式。
二、記憶鏈與鏈表:連續性的脆弱與韌性
洛克的記憶理論可以被建模為一條鏈表:
# 身份作為記憶鏈表
identity = memory_today -> memory_yesterday -> ... -> memory_childhood
每個節點連接著前一個,形成一條從現在延伸到過去的鏈。但鏈表有一個致命弱點:任何一個節點斷裂,後面的全部失聯。
失憶症就是這種斷裂。一個人失去了過去十年的記憶——那條鏈斷了。按照嚴格的洛克理論,失憶後的他和失憶前的他不是同一個人。
但我們直覺上不會這樣認為。他的家人依然認他、法律依然約束他、他的身體依然是同一個。這意味著,身份不只是一條單線的記憶鏈,而是一個多重連結的網路——記憶是一條線索,但身體的連續性、社會關係的承認、法律文件的記錄,都是額外的連結。
即使記憶鏈斷了,其他連結可以維持身份的穩定性。
這像分散式系統的容錯設計——不把所有身份資訊放在單一節點上,而是分散到多個獨立的來源。任何一個來源失效,其他來源可以繼續維持系統的運作。
更精確地說,你的身份不是一個值,而是一份持續被多方維護的共識。
三、垃圾回收:遺忘不是 bug,是 feature
程式裡沒有垃圾回收的系統最終會 memory leak——佔滿記憶體,然後崩潰。
人如果真的「什麼都記得」會怎樣?
有一種罕見的神經學狀況叫做超憶症(hyperthymesia)——患者能記住人生中幾乎每一天的細節。聽起來像超能力,但研究顯示,超憶症患者往往承受巨大的心理負擔。他們無法忘記痛苦的經歷、無法從創傷中恢復、無法讓過去「過去」。
遺忘是人類認知系統的垃圾回收機制。它不是缺陷——它是維持系統可運行性的關鍵功能。
# 人類的垃圾回收:遺忘不常用的記憶
def cognitive_gc(memories, relevance_threshold):
"""保留高相關性的記憶,釋放其餘"""
return [m for m in memories if m.relevance > relevance_threshold]
尼采在這一點上異常深刻。他在《論歷史的用途與濫用》中指出:動物之所以看起來快樂,是因為它們活在永恆的現在裡,不被記憶拖累。人需要一定程度的遺忘才能「向前走」——完全忠實的記憶是一種詛咒,而不是祝福。
從身份的角度看,這意味著一件反直覺的事:遺忘是身份更新的機制。
你之所以能改變——從一個 junior 成長為 senior、從一種價值觀轉向另一種——部分原因是你忘記了舊的自己。如果你同時記得所有版本的自己,並且同等重視它們,你可能會陷入一種身份的「版本衝突」,無法做出任何決定。
垃圾回收讓舊的記憶體被釋放,新的物件得以被創建。遺忘讓舊的自我退場,新的自我得以登台。
現代連結:數位分身與 AI 時代的身份危機
你的數位副本已經存在
你可能還沒意識到,但你的「數位分身」已經散布在網路的各個角落。
你的社群媒體檔案是你的一個副本——經過精心策展的版本。你的搜尋歷史是另一個副本——比你承認的更誠實。你在各個平台上的行為數據構成了一個統計模型——廣告系統用它來預測你的下一步。
現在,生成式 AI 讓這些副本更加逼真。你可以用你的聊天紀錄、寫作風格、語氣習慣來微調一個語言模型,讓它「像你一樣說話」。
這個 AI 副本可以代替你回覆郵件、在你不在時維持社交互動、甚至在你去世後繼續「存在」。
但它不是你。
就像深拷貝一樣——它在創建的瞬間與你相同,但從那一刻起,你們各自演化。你學了新東西、經歷了新感受、改變了某些想法,而它停留在你的過去。
問題是:其他人能分辨嗎?如果他們分辨不出來,那在社會意義上,它是不是「你」?
忒修斯之船的數位版
古希臘的忒修斯之船悖論問:一艘船的木板被逐一替換,直到沒有一塊原始的木板留下——它還是原來的那艘船嗎?
軟體系統每天都在經歷這個悖論。你重構一個模組、替換一個依賴、升級一個框架——直到沒有一行原始的程式碼留下。但使用者依然叫它同一個產品。
人也一樣。你的身體細胞在不斷更替,你的信念在不斷修正,你的記憶在每次回想時被悄悄改寫。嚴格來說,十年前的你和現在的你之間,可能沒有任何一個原子是相同的。
但你依然是「你」。
因為身份不是基於物質的延續,而是基於模式的延續。船的形狀、功能、名字延續著。軟體的介面、行為、使用者認知延續著。你的敘事、關係、自我認知延續著。
身份是一種連續性契約——由你自己、你周圍的人、以及社會制度共同維護。只要契約沒有被打破,身份就成立。
當契約被打破
但有些時刻,契約會被打破或被迫重新談判:
重大創傷——PTSD 可以讓一個人感覺「變成了另一個人」。在創傷之前和之後,記憶鏈可能存在,但人格的連續性被嚴重擾動。
技術複製——如果有一天我們真的可以上傳意識到雲端,法律和倫理必須回答:上傳的副本有沒有公民權?原本的人和副本之間的法律關係是什麼?
AI 冒充——當 deepfake 和 AI 語音可以完美模擬一個人,身份的社會認定機制就面臨根本性的挑戰。如果你的朋友無法分辨你和你的 AI 副本,身份的「社會引用」就被劫持了。
這些不再是遙遠的思想實驗。它們是正在發生的技術現實。
反思與啟示:程式人的身份素養
你想守住的是哪一種「同」?
面對身份問題,不同的人有不同的錨點:
有人守住價值觀——「不管我怎麼變,核心信念不變」。這像物件的一個 immutable 屬性。
有人守住關係——「只要這些人還認得我」。這像物件的外部引用。
有人守住敘事——「只要我能把過去和現在串成一個故事」。這像物件的 changelog。
有人守住名字——「只要我還叫這個名字」。這像變數名。
沒有哪個錨點是「正確」的。重要的是:你知道自己的錨點是什麼,以及當它被挑戰時,你怎麼回應。
身份是協作維護的系統
最深刻的洞察也許是:身份不是你一個人的事。
你的身份是由你的自我認知、他人的認定、社會的制度三方共同維護的。就像分散式系統需要多節點共識一樣,你的身份需要多方協作才能穩定。
當你一個人遠行、離開所有認識的人、進入一個全新的環境——你可能會感到一種身份的漂浮感。不是因為你「忘了自己是誰」,而是因為維護你身份的其他節點暫時離線了。
四個帶走的身份心智模型
-
區分
is和==——不要混淆「是同一個」和「看起來一樣」。數位副本可能和你==,但永遠不會is你。 -
身份是鏈表,不是常數——你不是一個固定不變的值,而是一系列狀態轉換的連續記錄。允許自己改變,不代表失去自己。
-
遺忘是功能,不是故障——適度的垃圾回收讓你的心智系統保持可運行。不需要記住一切,只需要維持連續性。
-
維護你的身份合約——主動管理你的自我敘事、你的重要關係、以及你在社會中的角色。身份不會自動維持——它需要持續的投入。
結語
回到那個 git blame 的下午。
十八個月前的那個我,和現在的我,共享同一個 git 帳號、同一段職業歷史、同一條記憶鏈。但我們的程式碼風格、技術判斷、甚至價值觀都已經不同。
我還是「我」嗎?
答案取決於你問的是哪一種「同」。
如果問的是數值同一性——是的,物理上連續的同一個身體。如果問的是性質同一性——不完全是,很多屬性已經改變。如果問的是心理連續性——是的,但那條鏈上的每一個節點都和前一個略有不同。
也許最好的答案是帕菲特式的:別太執著於「是不是同一個」這個問題。
重要的是,你和過去的自己之間有足夠的連續性讓你能學習,有足夠的差異讓你能成長。
就像一個持續被重構的系統——每一次重構都讓它變得更好,而使用者始終把它當作同一個產品。
你是一個持續重構中的系統。別怕改變。
下一篇預告
因果鏈與函數調用
你追了三天的 bug,終於找到 root cause。但等等——你找到的真的是「原因」嗎?還是只是 stack trace 上離你最近的那個節點?
- 休謨說你從來沒有「看見」因果——你只是看見了前後發生的事件。那程式的 call stack 算不算真正的因果鏈?
- 在事件驅動和併發系統裡,因果為什麼會從一條線變成一張網?
- 推薦系統的回饋迴圈:當結果回頭改寫原因,你還能找到 root cause 嗎?
- Postmortem 的真正目的是什麼——找一個人背鍋,還是建立可修復的結構?
下一篇,我們從函數調用和事件驅動出發,拆解因果關係的哲學迷宮。
參考資料
- Locke, John. An Essay Concerning Human Understanding, Book II, Ch. 27. 1689. (心理連續性理論)
- Parfit, Derek. Reasons and Persons. Oxford University Press, 1984. (個人同一性與心理連續性)
- Reid, Thomas. Essays on the Intellectual Powers of Man, Essay III. 1785. (勇敢軍官悖論)
- Nietzsche, Friedrich. “On the Uses and Disadvantages of History for Life.” Untimely Meditations, 1874. (遺忘的價值)
- Plutarch. Life of Theseus. (忒修斯之船悖論)
- Nozick, Robert. Philosophical Explanations. Harvard University Press, 1981. (最近連續者理論)
- Floridi, Luciano. The Fourth Revolution. Oxford University Press, 2014. (數位身份的哲學)
