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 notwhen: 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 Nonewhen checking if a variable is notNone. This is idiomatic Python and more robust than!= Nonebecauseis notchecks 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
ismight returnTrueeven for seemingly distinct variables. However, rely onis notonly 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.