波蘭開發(fā)者 Maciej Kowalski 近日在其個人博客整理了一系列關(guān)于 Python 的“怪異”設(shè)計。這些特性看似反直覺,實則反映了 Python 作為一門純面向?qū)ο笳Z言的核心哲學(xué)——一切皆對象。
Python 比俄羅斯聯(lián)邦還老。這是文章給出的第一個冷知識。
![]()
Python 誕生于 1991 年 2 月 20 日,而蘇聯(lián)解體發(fā)生在同年 12 月 26 日。這意味著 Python 實際上比俄羅斯聯(lián)邦還要年長近 10 個月。盡管近年來 Python 因人工智能和數(shù)據(jù)科學(xué)的爆發(fā)而風(fēng)靡全球,甚至波茲南工業(yè)大學(xué)都已用 Python 取代 Delphi 作為教學(xué)語言,但它本質(zhì)上是一門有著 30 多年歷史的成熟語言。
更讓人感到意外的是,在 Python 中 bool 竟然是 int 的子類。查看 CPython 的 builtins.pyi 定義可以清楚地看到 class bool(int) 這樣的繼承關(guān)系。因此 True + True 的結(jié)果是 2,而不是報錯。
![]()
這與 Java 等語言形成鮮明對比——Java 中 true + true 會直接觸發(fā)編譯錯誤。Python 的設(shè)計者認為這種多態(tài)更加優(yōu)雅,而且它允許開發(fā)者通過繼承 int 來創(chuàng)建自定義數(shù)值類型。例如,作者展示了一個 modulo10 類,繼承自 int 并對加法運算取模,可以直接賦值給 int 類型的變量而不會觸發(fā)類型檢查錯誤。
class modulo10(int):
def __add__(self, other):
return super().__add__(other) % 10x: int = modulo10(5) # no errors, types match
assert x + 6 == 1# pas
Python 中的 None、True、False 都是單例對象(singleton),在解釋器啟動時就被創(chuàng)建,垃圾回收器永遠不會觸碰它們。反復(fù)調(diào)用 id(None) 會得到完全相同的內(nèi)存地址。更實用的是小整數(shù)緩存機制:CPython 會預(yù)先分配 -5 到 256 之間的整數(shù)對象。這本質(zhì)上是計算機科學(xué)中經(jīng)典的 interning 模式,可以顯著減少內(nèi)存分配開銷。
文章還提到了一個容易被忽視的陷阱——Python 的循環(huán)垃圾回收是可選的。只需四行代碼就能人為制造內(nèi)存泄漏:導(dǎo)入 gc 模塊,調(diào)用 gc.disable() 禁用循環(huán)垃圾回收器,然后創(chuàng)建一個自引用的列表 a = []; a.append(a)。由于 Python 主要依賴引用計數(shù)來管理內(nèi)存,而循環(huán)引用會導(dǎo)致引用計數(shù)永遠無法歸零,如果同時關(guān)閉了循環(huán)垃圾回收器,這段內(nèi)存就真的泄漏了。
import gc
gc.disable()
a = []
a.append(a)
此外,文章還提到了 GIL(全局解釋器鎖)這一老生常談的話題。由于 GIL 的存在,Python 的多線程程序在任意時刻只有一個線程在執(zhí)行 Python 字節(jié)碼,無論你的 CPU 有多少核心。對于 I/O 密集型任務(wù),多線程依然有意義;但對于 CPU 密集型任務(wù),多線程不僅無益,甚至可能適得其反。值得慶幸的是,Python 3.13 已經(jīng)引入了實驗性的自由線程模式,未來 GIL 有望被徹底移除。
文章還簡要提及了slots內(nèi)存優(yōu)化、可變對象作為默認參數(shù)的經(jīng)典陷阱,以及元類(metaclass)等高級特性。這些設(shè)計共同構(gòu)成了 Python“一切皆對象”的語言哲學(xué)——函數(shù)是對象、類型是對象、甚至類本身也是對象。
參考來源:https://kowal.dev/blog/python-is-weird/
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.