Em Python, o operador is é o comparador de instância de objetos, e não de valores.

x = [2, 3, 4]
y = [2, 3, 4]
x is y

Retorna:

False

pois apesar dos valores serem iguais, se tratam de objetos completamente diferentes.

**is** e strings

Não se iluda com este exemplo:

is e strigs

Neste caso, apesar da impressão da comparação com is se comportar identicamente à feita com ==, o que está acontecendo aqui é outra coisa. O Python é “esperto” o suficiente para não alocar várias vezes valores repetidos de string, então ele aponta o nome do novo objeto para a string já armazenada anteriormente, efetivamente aproveitando os dados já alocados.

Strings normalmente devem ser comparadas com ==, a não ser que você saiba exatamente o que está fazendo.

**is** e alguns inteiros

Olhe o exemplo a seguir:

is e alguns inteiros

Isto é devido a uma peculiaridade determinada por implementação: quando você usa números de -5 até 256, o Python já tem uma tabela de armazenamento interna, cujos objetos já estão criados nativamente e seu ID é aproveitado.

O operador ==:

O == é o comparador de valores, como na maior parte das linguagens. O objeto pode ser diferente, o que interessa para a comparação é o valor:

>>> x = 1278
>>> y = 1278
>>> x == y

Retorna:

True

A função id():

Se houver necessidade de debugar uma situação onde o is não se comporta como esperado, pode-se utilizar a função id() para se obter o ID interno dos objetos, como no exemplo a seguir:

função id()

Comparando com o None:

O None é um objeto especial em Python e representa a ausência de valor, de certa forma como o null de algumas linguagens. Por se tratar de um objeto que representa a ausência e não um valor em si, você deve usar x is None e x is not None, e nunca x == None e x != None.

Atenção com este caso especial:

if( x is None )

Neste caso, um programador experiente em outras linguagens poderia se sentir tentado a usar simplesmente if ( x ), imaginando que o None já seria considerado falso. Assim como a comparação de valores não deve ser usada com o None, no if a verficação também requer o is None ou is not None.

Implementando a comparação em classes:

Os métodos que implementam a comparação is e == em Python são respectivamente __is__ e __eq__, e neste caso, o programador deve ter plena consciência das diferenças mencionadas acima. A grosso modo, é algo nesta linha:

comparação em classes