# What is "is" in Python?

Updated: Sep 23, 2019

The operatorsandistest for object identity. xis noty isisif and only if x and y are the same object (object location in memory is same). Object identity is determined using the id() function. xtruey yields the inverse truth value.is not

It’s easy to understand if I compare this operator with equality operator.

**is**and**is not**compares the object reference. Check for identity.**==**and**!=**compares the object value. Check for equality.

For example, if you consider integer objects (excluding integers from -5 to 256),

>>> A=9999

>>> B=9999

>>> A == B, AisB

(True,False)

>>> A, B

(9999, 9999)

>>> id(A), id(B)

(4452685328, 4452686992)

Python stores integer objects as single object between range -5 to 256 so the identity is same.

>>> A=99

>>> B=99

>>> A == B, AisB

(True,True)

>>> A, B

(99, 99)

>>> id(A), id(B)

(4404392064, 4404392064)

Lets see behavior of other immutable objects like int & float, string, tuples and boolean:

>>> 1 == 1.0, 1is1.0

(True,False)

>>> 1 == 1, 1is1

(True,True)

>>> 'A' == 'A', 'A'is'A'

(True,True)

>>> (1,2) == (1,2), (1,2)is(1,2)

(True,True)

>>>True==True,TrueisTrue

(True,True)

What about mutable objects - list, set, dict? Behavior is totally different.

>>> [1,2] == [1,2], [1,2]is[1,2]

(True,False)

>>> {1,2} == {1,2}, {1,2}is{1,2}

(True,False)

>>> {'k1':1} == {'k1':1}, {'k1':1}is{'k1':1}

(True,False)

** is** operator is used only when you want to compare the object identity, for regular comparison equality operator is used.