Python provides two different operators for comparison:
==(Equality Operator) → Compares values of two objects.is(Identity Operator) → Compares whether two variables point to the same object in memory.
Using is instead of == for value comparison can lead to incorrect behavior, especially when working with strings, numbers, lists, and other mutable objects. Let’s go step by step to understand this issue.
1. Understanding == vs is
Using == (Equality Operator)
- Checks if two objects have the same value.
- Works for numbers, strings, lists, tuples, dictionaries, etc.
Example (Correct Usage of ==):
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (Same values)
print(a is b) # False (Different memory locations)
- The lists
aandbhave the same values (==isTrue). - However, they are different objects in memory, so
isisFalse.
Using is (Identity Operator)
- Checks if two variables refer to the same memory location.
- Works correctly for singleton objects like
None,True,False.
Example (Correct Usage of is):
x = None
y = None
print(x is y) # True (Both point to the same `None` object)
Noneis a singleton (only one instance exists), soisworks correctly.
2. Common Mistakes: Using is Instead of ==
Mistake 1: Using is for Value Comparison
a = "hello"
b = "hello"
print(a is b) # Might be True due to interning, but not guaranteed!
Fix: Use == for comparing string values.
print(a == b) # True (Correct)
Mistake 2: Using is to Compare Integers
Python interns small integers (usually between -5 and 256), meaning they might have the same memory address.
x = 100
y = 100
print(x is y) # True (Might be True due to interning)
However, for large numbers:
a = 500
b = 500
print(a is b) # False (Different memory locations)
Fix: Always use == for numerical comparisons.
print(a == b) # True (Correct)
Mistake 3: Using is Instead of == for Lists, Tuples, and Dicts
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 is list2) # False (Different objects)
print(list1 == list2) # True (Same values)
Fix: Use == for comparing contents of lists.
Mistake 4: Using is Instead of == for Booleans
flag = True
if flag is True: # Not recommended
print("Flag is True")
Fix: Use == for boolean values.
if flag == True: # Correct
print("Flag is True")
3. When Should You Use is?
Use is for Singleton Objects (None, True, False)
if value is None:
print("No value assigned")
Use is for Object Identity Checks
a = [1, 2, 3]
b = a
print(a is b) # True (Same object in memory)
Use == for Comparing Values
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 == list2) # True (Same content)
print(list1 is list2) # False (Different objects in memory)
4. Summary: When to Use == and is
| Scenario | Use == (Value Comparison) | Use is (Identity Check) |
|---|---|---|
| Comparing numbers/strings | Yes | No |
| Comparing lists/dictionaries | Yes | No |
Checking None | No | Yes |
| Checking if two variables refer to the same object | No | Yes |
Comparing Boolean values (True, False) | Yes | No |
