說到 Python 里的 is 和 ==,很多人第一反應是:“不就是一個判斷相等、一個判斷是不是同一個對象嘛,有啥可聊的?”確實,表面看起來沒什么神秘的,但真要在面試里聊清楚、寫代碼不踩坑,還真得拆開說說,尤其是那些隱藏的細節,平時不注意就可能讓你“線上翻車”。
先說個直白的定義,== 比較的是兩個對象的“值”是不是相等,而 is 比較的是兩個對象的“身份”是不是一樣,也就是它們是不是同一個內存地址的實例。用人話說就是,== 像是在問“咱倆長得一樣不?”,而 is 則是在問“你就是我本人嗎?”
比如這段小代碼:、
這就很好理解,a 和 b 雖然長得一樣(值相同),但它們是兩個不同的列表對象,is 肯定不成立。但是坑就坑在,有些時候 Python 會在幕后幫你“省事”,它覺得兩個值一模一樣,干脆就讓它們指向同一個對象,這樣節省內存,這就是所謂的 對象緩存機制。最常見的例子就是小整數緩存和短字符串駐留(interning)。
很多人第一次被坑,就是在字符串比較的時候偷懶用 is,結果測試的時候沒問題,線上來了個不一樣的情況直接掛了。再說一個常見誤區,就是一些“可變對象”和“不可變對象”的差別。is 在可變對象上判斷身份很重要,因為它們值可能會變。如果你用 == 判斷字典或者列表,值一樣也會通過,但這不代表它們真的是同一個對象。比如:
在這里,a 和 b 是同一個對象,所以改一個另一個也跟著改。用 is 就能發現這種情況。而對于不可變對象,比如 int、str、tuple,值一旦創建就不能改,所以你一般不關心它們是不是同一個對象,用 == 就足夠。面試的時候,有些考官會故意給你一些“邊界值”測試,比如:
這樣寫比 x == None 要好,因為后者在某些奇怪的對象實現里可能被重載掉 __eq__,導致比較結果不符合預期。說實話,這個知識點看著小,但在面試里經常是用來判斷你是不是對 Python 內存模型和對象機制有底層理解的。如果你回答只是“一個比值,一個比身份”,那就太表面了,最好能順帶講講小整數池、interning、以及可變不可變對象的行為差別,這樣才能顯得你是真懂。如果你愿意,我們還可以用幾段更“詭異”的例子,把這個坑挖深,比如涉及 is、==、id()、以及 sys.intern() 的組合玩法,那才是 Python 面試里的黑魔法級別。這樣的話,不僅能讓面試官滿意,還能防止自己以后踩坑。
以上就是“Python 中 is 和 == 的區別,什么時候會出現“坑”?”的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/13379/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料