全棧工程師對Python面試中is和==區別的詳細解說!看完真的學到了!

来源:https://www.cnblogs.com/chengxyuan/archive/2019/11/23/11919270.html
-Advertisement-
Play Games

面試實習生的時候,當問到 is 和 == 的區別時,很多同學都答不上來,搞不清兩者什麼時候返回一致,什麼時候返回不一致。本文我們來看一下這兩者的區別。 我們先來看幾個例子: a = "hello" b = "hello" print(a is b) # 輸出 True print(a == b) # ...


面試實習生的時候,當問到 is 和 == 的區別時,很多同學都答不上來,搞不清兩者什麼時候返回一致,什麼時候返回不一致。本文我們來看一下這兩者的區別。

我們先來看幾個例子:

a = "hello"
b = "hello"
print(a is b)  # 輸出 True 
print(a == b)  # 輸出 True

a = "hello world"
b = "hello world"
print(a is b)  # 輸出 False
print(a == b)  # 輸出 True 

a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)  # 輸出 False
print(a == b)  # 輸出 True 

a = [1, 2, 3]
b = a
print(a is b)  # 輸出 True 
print(a == b)  # 輸出 True 

上面的輸出結果中為什麼有的 is 和 == 的結果相同,有的不相同呢?我們來看下官方文檔中對於 is 和 == 的解釋。

官方文檔中說 is 表示的是對象標示符(object identity),而 == 表示的是相等(equality)。is 的作用是用來檢查對象的標示符是否一致,也就是比較兩個對象在記憶體中的地址是否一樣,而 == 是用來檢查兩個對象是否相等。

我們在檢查 a is b 的時候,其實相當於檢查 id(a) == id(b)。而檢查 a == b 的時候,實際是調用了對象 a 的 eq() 方法,a == b 相當於 a.eq(b)。

一般情況下,如果 a is b 返回True的話,即 a 和 b 指向同一塊記憶體地址的話,a == b 也返回True,即 a 和 b 的值也相等。

好了,看明白上面的解釋後,我們來看下前面的幾個例子

a = "hello"
b = "hello"
print(id(a))   # 輸出 140506224367496
print(id(b))   # 輸出 140506224367496
print(a is b)  # 輸出 True 
print(a == b)  # 輸出 True

a = "hello world"
b = "hello world"
print(id(a))   # 輸出 140506208811952
print(id(b))   # 輸出 140506208812208
print(a is b)  # 輸出 False
print(a == b)  # 輸出 True 

a = [1, 2, 3]
b = [1, 2, 3]
print(id(a))   # 輸出 140506224299464
print(id(b))   # 輸出 140506224309576
print(a is b)  # 輸出 False
print(a == b)  # 輸出 True 

a = [1, 2, 3]
b = a
print(id(a))   # 輸出 140506224305672
print(id(b))   # 輸出 140506224305672
print(a is b)  # 輸出 True 
print(a == b)  # 輸出 True 

列印出 id(a) 和 id(b) 後就很清楚了。只要 a 和 b 的值相等,a == b 就會返回True,而只有 id(a) 和 id(b) 相等時,a is b 才返回 True。

這裡還有一個問題,為什麼 a 和 b 都是 "hello" 的時候,a is b 返回True,而 a 和 b都是 "hello world" 的時候,a is b 返回False呢?

這是因為前一種情況下Python的字元串駐留機制起了作用。對於較小的字元串,為了提高系統性能Python會保留其值的一個副本,當創建新的字元串的時候直接指向該副本即可。所以 "hello" 在記憶體中只有一個副本,a 和 b 的 id 值相同,而 "hello world" 是長字元串,不駐留記憶體,Python中各自創建了對象來表示 a 和 b,所以他們的值相同但 id 值不同。(這段解釋有誤,非常感謝冒泡同學指正。冒泡同學指出:intern機制和字元串長短無關,在交互模式下,每行字元串字面量都會申請一個新字元串,但是只含大小寫字母、數字和下劃線的會被intern,也就是維護了一張dict來使得這些字元串全局唯一)

總結一下,is 是檢查兩個對象是否指向同一塊記憶體空間,而 == 是檢查他們的值是否相等。可以看出,is 是比 == 更嚴格的檢查,is 返回True表明這兩個對象指向同一塊記憶體,值也一定相同。在學習Python的過程中,往往因為沒有資料或者沒人指導從而導致自己不想學下去了,因此我特意準備了個群 592539176 ,群里有大量的PDF書籍、教程都給大家免費使用!不管是學習到哪個階段的小伙伴都可以獲取到自己相對應的資料!

看到這裡,大家是不是搞懂了 is 和 == 的區別呢?

那我們深入一步來思考一下下麵這個問題:

Python里和None比較時,為什麼是 is None 而不是 == None 呢?

歡迎回答在評論區~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Python函數中,傳遞的參數如果預設有一個為 列表(list),那麼就要註意了,此處有坑. 入坑 挖坑 預期結果 執行結果 出坑 當定義函數時,會保存函數中預設參數 list 的值,也就是列表 li=[]; 在每次調用的時候如果傳遞了新的列表,則使用傳遞的列表,沒有傳遞,使用定義函數時保存的預設 ...
  • 前言文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者: Rocky0429 在學習 Python 的過程中,我為它的簡潔優雅而痴迷,但它又是如此的調皮,在提供了很多舒服的功能特性之外,又悄悄挖了很多帶有迷惑性的坑,令人防不勝防 ...
  • 這是209.11.23的博客 下麵進入正題 Opencv的內容 各位都是大佬 HSV的顏色表和計算方法就不用說了吧 #include <opencv2/opencv.hpp> #include<iostream> #include<string> using namespace cv; using ...
  • 例17 百燈判亮 問題描述 有序號為1、2、3、…、99、100的100盞燈從左至右排成一橫行,且每盞燈各由一個拉線開關控制著,最初它們全呈關閉狀態。有100個小朋友,第1位走過來把凡是序號為1的倍數的電燈開關拉一下;接著第2位小朋友走過來,把凡是序號為2的倍數的電燈開關拉一下;第3位小朋友走過來, ...
  • SpringBoot讓你的Bean動起來(自定義參數解析HandlerMethodArgumentResolver) 簡介 我們 用到的一些 需要通過一定的方式去獲取的,可以通過註入方式獲取其他獲取方式進行獲取。 比如:需要用到用戶實例,我們通常做法為下 這樣是一般的做法,我們可以發現 可以通過註入 ...
  • 例16 巧解算式 問題描述 在1、2、3、4、5、6、7、8、9、10個數中間加上加號或減號,使得到的表達式的值為自然數N,如果中間沒有符號,則認為前後為一個數,如1 2 3認為是一百二十三(123)。 例如:當N=100時,表達式值為100的填法有24種。123+4+5+67-89-10=100是 ...
  • 參考:《深入理解JAVA虛擬機》第二版 3.3 垃圾收集演算法 由於垃圾收集演算法的實現涉及大量的程式細節,而且各個平臺的虛擬機操作記憶體的方法又各不相同,只是介紹幾種演算法的思想及其發展過程。 3.3.1 標記 清除演算法 最基礎的收集演算法是“標記 清除”(Mark Sweep)演算法。 演算法分為 標記和清除 ...
  • 在網上看到有關Redis的50道面試題,但是沒有給出答案,之前我也在尋找這份Redis面試題的答案,今天特地把答案分享出來。 花了大量時間整理了這套Redis面試題及答案,希望對大家有幫助哈~ 弄明白了這些Redis面試題基本上就可以成為面霸了,弔打面試官,哈哈~ 1、什麼是Redis? Redis ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...