Python 簡易手冊
單元 18 - is 運算子
is 運算子 (operator) 用來判斷前後運算元 (operand) 是否為相同的物件 (object) ,舉例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 建立兩個空字串變數 a = "" b = "" # 判斷兩個變數的值是否相等 print(a == b) # 判斷兩個變數是否為相同物件 print(a is b) # 印出兩個變數所指向的記憶體位址 print(id(a)) print(id(b)) # 檔名: is_demo.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
此例先建立兩個空字串 (string) 變數 (variable) ,然後在第 6 行用連續兩個等號判斷兩個變數的值 (value) 是否相等
5 6 | # 判斷兩個變數的值是否相等 print(a == b) |
字串會在單元 33 - 字串詳細介紹。
繼續在第 9 行用 is 運算子判斷兩個變數是否為相同物件
8 9 | # 判斷兩個變數是否為相同物件 print(a is b) |
由於字串是不可變的 (immutable) ,因此凡是程式中建立任一字串,這個字串物件只會被建立一次,接下來所有變數都會只指向這個唯一的字串物件,第 12 行與第 13 行利用內建函數 (built-in function) id() 會印出兩個變數的記憶體位址
11 12 13 | # 印出兩個變數所指向的記憶體位址 print(id(a)) print(id(b)) |
如果記憶體位址是一樣的,那就表示這兩個是相同的物件,此例執行結果如下
> python is_demo.py |
True True 4325992760 4325992760 |
> |
反之如果是可變的 (mutable) 資料型態,那具有相同的值並不代表是相同物件,因為可變資料型態的物件可變動內容,例如以下將上例用串列 (list) 改寫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 建立兩個空串列變數 a = [] b = [] # 判斷兩個變數的值是否相等 print(a == b) # 判斷兩個變數是否為相同物件 print(a is b) # 印出兩個變數所指向的記憶體位址 print(id(a)) print(id(b)) # 檔名: is_demo2.py # 說明: 《Python簡易手冊》的範例 # 網址: http://kaiching.org # 作者: Kaiching Chang # 時間: 2024 年 3 月 |
串列會在單元 39 - 串列詳細介紹。
以上只有將變數改成空串列,執行結果如下
> python is_demo2.py |
True False 4378364288 4378366144 |
> |
兩個空串列具有相同的值,但不是相同的物件。
參考資料
- https://docs.python.org/3/reference/expressions.html#comparisons
- https://docs.python.org/3/library/stdtypes.html#truth-value-testing