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
a
andb
have the same values (==
isTrue
). - However, they are different objects in memory, so
is
isFalse
.
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)
None
is a singleton (only one instance exists), sois
works 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 |