# 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, A `**is** B

`(`**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, A `**is** B

`(`**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, 1 `**is** 1.0

`(`**True**, **False**)

`>>> 1 == 1, 1 `**is** 1

`(`**True**, **True**)

`>>> 'A' == 'A', 'A' `**is** 'A'

`(`**True**, **True**)

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

`(`**True**, **True**)

`>>> `**True** == **True**, **True** **is** **True**

`(`**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.