編程學習網 > 編程語言 > Python > Python 中 is 和 == 的區別,什么時候會出現“坑”?
2025
08-19

Python 中 is 和 == 的區別,什么時候會出現“坑”?


說到 Python 里的 is 和 ==,很多人第一反應是:“不就是一個判斷相等、一個判斷是不是同一個對象嘛,有啥可聊的?”確實,表面看起來沒什么神秘的,但真要在面試里聊清楚、寫代碼不踩坑,還真得拆開說說,尤其是那些隱藏的細節,平時不注意就可能讓你“線上翻車”。

先說個直白的定義,== 比較的是兩個對象的“值”是不是相等,而 is 比較的是兩個對象的“身份”是不是一樣,也就是它們是不是同一個內存地址的實例。用人話說就是,== 像是在問“咱倆長得一樣不?”,而 is 則是在問“你就是我本人嗎?”

比如這段小代碼:、


這就很好理解,a 和 b 雖然長得一樣(值相同),但它們是兩個不同的列表對象,is 肯定不成立。但是坑就坑在,有些時候 Python 會在幕后幫你“省事”,它覺得兩個值一模一樣,干脆就讓它們指向同一個對象,這樣節省內存,這就是所謂的 對象緩存機制。最常見的例子就是小整數緩存和短字符串駐留(interning)。

在 CPython 里,-5 到 256 之間的整數會被提前緩存,所以你寫多少個 256,其實它們都是指向同一個對象。超過這個范圍,Python 不一定會復用同一個對象,所以 is 的結果可能變成 False。字符串也有類似的事,比如短的、不包含特殊字符的字符串常量,可能會被自動駐留:

很多人第一次被坑,就是在字符串比較的時候偷懶用 is,結果測試的時候沒問題,線上來了個不一樣的情況直接掛了。再說一個常見誤區,就是一些“可變對象”和“不可變對象”的差別。is 在可變對象上判斷身份很重要,因為它們值可能會變。如果你用 == 判斷字典或者列表,值一樣也會通過,但這不代表它們真的是同一個對象。比如:

在這里,a 和 b 是同一個對象,所以改一個另一個也跟著改。用 is 就能發現這種情況。而對于不可變對象,比如 int、str、tuple,值一旦創建就不能改,所以你一般不關心它們是不是同一個對象,用 == 就足夠。面試的時候,有些考官會故意給你一些“邊界值”測試,比如:


結果可能讓你驚訝,因為 10**3 會在運行時生成新對象,而不是引用緩存的常量,這時候 is 很可能是 False。這其實就是在考你知不知道 Python 在什么時候會做對象重用、什么時候不會。還有一個坑是用 is 判斷 None,這反而是官方推薦的寫法,因為 None 是一個單例,全局就那一個:

這樣寫比 x == None 要好,因為后者在某些奇怪的對象實現里可能被重載掉 __eq__,導致比較結果不符合預期。說實話,這個知識點看著小,但在面試里經常是用來判斷你是不是對 Python 內存模型和對象機制有底層理解的。如果你回答只是“一個比值,一個比身份”,那就太表面了,最好能順帶講講小整數池、interning、以及可變不可變對象的行為差別,這樣才能顯得你是真懂。如果你愿意,我們還可以用幾段更“詭異”的例子,把這個坑挖深,比如涉及 is、==、id()、以及 sys.intern() 的組合玩法,那才是 Python 面試里的黑魔法級別。這樣的話,不僅能讓面試官滿意,還能防止自己以后踩坑。

以上就是“Python 中 is 和 == 的區別,什么時候會出現“坑”?的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取