Is there a "not equal" operator in Python?
Categories:
Python's 'Not Equal' Operators: Understanding != and is not

Explore Python's 'not equal' operators, !=
and is not
, to effectively compare values and object identities in your code. Learn their differences and best use cases.
In Python, comparing if two things are not the same is a fundamental operation. Unlike some languages that might have a single operator for this, Python offers two primary ways to express 'not equal': the !=
operator and the is not
operator. While both convey a sense of inequality, they operate on different principles – one compares values, and the other compares object identities. Understanding this distinction is crucial for writing correct and efficient Python code.
The !=
Operator: Value Inequality
The !=
operator (read as 'not equal to') is used to compare the values of two operands. It returns True
if the values are different, and False
if they are the same. This is the most common way to check for inequality in Python and is suitable for comparing numbers, strings, lists, dictionaries, and other objects where you care about their content.
a = 10
b = 20
c = 10
d = [1, 2, 3]
e = [1, 2, 3]
print(f"a != b: {a != b}") # Output: True
print(f"a != c: {a != c}") # Output: False
print(f"d != e: {d != e}") # Output: False (values are the same)
print(f"'hello' != 'world': {'hello' != 'world'}") # Output: True
Examples of using the !=
operator for value comparison.
!=
operator is essentially the inverse of the ==
(equality) operator. If a == b
is True
, then a != b
will be False
, and vice-versa.The is not
Operator: Identity Inequality
The is not
operator, on the other hand, compares the identity of two objects. It returns True
if two variables refer to different objects in memory, and False
if they refer to the exact same object. This is a more stringent comparison than !=
and is typically used when you need to check if two variables are literally the same instance of an object, rather than just having the same value.
list1 = [1, 2, 3]
list2 = [1, 2, 3]
list3 = list1
print(f"list1 is not list2: {list1 is not list2}") # Output: True (different objects, even if values are same)
print(f"list1 is not list3: {list1 is not list3}") # Output: False (same object in memory)
x = None
y = None
print(f"x is not y: {x is not y}") # Output: False (Python often interns None, True, False)
# For small integers, Python often interns them, leading to 'is' returning True
a = 5
b = 5
print(f"a is not b: {a is not b}") # Output: False (often same object for small integers)
Examples demonstrating the is not
operator for identity comparison.
flowchart TD A[Start Comparison] --> B{Are values different? (using !=)} B -- Yes --> C[Result: True] B -- No --> D[Result: False] A --> E{Are object identities different? (using is not)} E -- Yes --> F[Result: True] E -- No --> G[Result: False]
Decision flow for !=
(value) vs. is not
(identity) operators.
When to Use Which Operator
Choosing between !=
and is not
depends entirely on what you intend to compare:
- Use
!=
when: You want to check if the content or value of two objects is different. This is the most common scenario for general comparisons. - Use
is not
when: You want to check if two variables refer to different instances of an object in memory. This is particularly useful for singletons (likeNone
,True
,False
) or when you need to ensure an object is not the exact same one you started with, especially after operations that might return a new object or the original one.
is not
to compare values of mutable objects like lists or dictionaries unless you specifically intend to check for object identity. For value comparison, !=
is almost always the correct choice.Common Pitfalls and Best Practices
While !=
and is not
are straightforward, misuse can lead to subtle bugs. Here are some best practices:
- Comparing with
None
: Always useis not None
when checking if a variable is notNone
. This is idiomatic Python and more robust than!= None
becauseis not
checks for identity, which is what you typically mean when dealing withNone
. - Mutable vs. Immutable: Be especially mindful when comparing mutable objects. Two lists
[1, 2]
and[1, 2]
are==
(equal in value) butis not
(different objects). - Performance: For simple types and small integers/strings, Python often interns objects, meaning
is
might returnTrue
even for seemingly distinct variables. However, rely onis not
only when object identity is the explicit requirement, not as a general performance optimization for value comparison.
my_var = []
# Correct way to check if not None
if my_var is not None:
print("my_var is not None")
# Incorrect/less robust way for None check
if my_var != None:
print("my_var is not None (using !=)") # This also works, but 'is not' is preferred for None
# Comparing empty list
list_a = []
list_b = []
print(f"list_a == list_b: {list_a == list_b}") # Output: True (values are same)
print(f"list_a is not list_b: {list_a is not list_b}") # Output: True (different objects)
Best practices for using is not
with None
and comparing empty lists.