Pointers memory personal identity

指標與記憶體:個人身份的連續性

系列:程式人的哲學思辨 #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 bFalse

日常生活中,我們在這兩種同一性之間不斷切換。你說「我還是十年前的那個我」——用的是數值同一性。你說「我已經完全變了一個人」——用的是性質同一性的否定。

但問題是:如果你的性質全部改變了,你的數值同一性還能成立嗎?

引用與實體:你是指標,還是指標指向的東西?

在程式裡,變數名只是一個引用——一個指向某個記憶體位置的標籤。

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。

有人守住名字——「只要我還叫這個名字」。這像變數名。

沒有哪個錨點是「正確」的。重要的是:你知道自己的錨點是什麼,以及當它被挑戰時,你怎麼回應。

身份是協作維護的系統

最深刻的洞察也許是:身份不是你一個人的事。

你的身份是由你的自我認知、他人的認定、社會的制度三方共同維護的。就像分散式系統需要多節點共識一樣,你的身份需要多方協作才能穩定。

當你一個人遠行、離開所有認識的人、進入一個全新的環境——你可能會感到一種身份的漂浮感。不是因為你「忘了自己是誰」,而是因為維護你身份的其他節點暫時離線了。

四個帶走的身份心智模型

  1. 區分 is==——不要混淆「是同一個」和「看起來一樣」。數位副本可能和你 ==,但永遠不會 is 你。

  2. 身份是鏈表,不是常數——你不是一個固定不變的值,而是一系列狀態轉換的連續記錄。允許自己改變,不代表失去自己。

  3. 遺忘是功能,不是故障——適度的垃圾回收讓你的心智系統保持可運行。不需要記住一切,只需要維持連續性。

  4. 維護你的身份合約——主動管理你的自我敘事、你的重要關係、以及你在社會中的角色。身份不會自動維持——它需要持續的投入。


結語

回到那個 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. (數位身份的哲學)


程式人的哲學思辨・系列導航

主系列

#00 導讀:為什麼程式人需要哲學?

#01 真理是一個函數嗎?

#02 知識就是資料嗎?

#03 我思故我在.py

#04 時間複雜度 vs. 時間本質

#05 指標與記憶體:個人身份的連續性 ← 你在這裡

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *