Python มี 2 วิธีเปรียบเทียบออบเจ็กต์ที่ทำงานต่างกัน:
== (Equality Operator)
- เปรียบเทียบ ค่า (value) ของออบเจ็กต์
- สองออบเจ็กต์ที่มีเนื้อหาเหมือนกัน → True
- ใช้
__eq__()method
is (Identity Operator)
- เปรียบเทียบ ตัวตน/ที่อยู่หน่วยความจำ (identity/reference)
- สองตัวแปรอ้างอิง ออบเจ็กต์เดียวกัน → True
- ไม่สามารถ override ได้
ตัวอย่าง
list_1 = ['t', 'u', 't', 'o', 'r'] list_2 = ['t', 'u', 't', 'o', 'r'] # เนื้อหาเหมือน แต่ออบเจ็กต์ต่างกัน list_3 = list_1 # อ้างอิงออบเจ็กต์เดียวกัน print(list_1 == list_2) # True (ค่าเท่ากัน) print(list_1 is list_2) # False (ออบเจ็กต์ต่างกัน) print(list_1 is list_3) # True (ออบเจ็กต์เดียวกัน)
ผลลัพธ์
True False True
กรณีพิเศษ: Integer Caching
a = 256 b = 256 print(a is b) # True (Python cache small integers -5 to 256) c = 257 d = 257 print(c is d) # False (นอกช่วง cache)
แนวทางปฏิบัติที่ดี
- ใช้
==สำหรับเปรียบเทียบค่า (ส่วนใหญ่) - ใช้
isสำหรับเช็คNone,True,Falseหรือ singleton objects - อย่าใช้
isเปรียบเทียบ string หรือ number (พฤติกรรมไม่แน่นอน)