Qual a diferença entre os operadores "==" e "is" em Python?

Alex Barros
6 min readAug 29, 2021

Os dois operadores podem até produzir o mesmo resultado as vezes, mas vamos mostrar as diferenças e quando usar cada um deles.

Comparar dois objetos é uma tarefa bem comum enquanto estamos desenvolvendo qualquer tipo de programa. Para comparar strings e variáveis numéricas nós geralmente utilizamos o operador de igualdade == , contudo, para comparar dois objetos o operador is é mais adequado

Nesse artigo nós tentamos explicar como cada um desses operadores funcionam e com alguns exemplos vamos esclarecer algumas dúvidas comuns.

Fique a vontade para comentar ou entrar em contato com dúvidas ou sugestões de mais conteúdo.

Acesse @aprendadatascience e www.aprendadatascience.com para mais informações.

Igualdade ou identidade?

Para entender melhor esses dois conceitos nós usaremos a clássica analogia dos gêmeos. Eles são parecidos, se você olhar uma foto deles é bem provável que você não possa dizer quem é quem. Mas possuem identidades diferentes não é?

O operador == é chamado de igualdade. Caso os gêmeos fossem objetos em python e utilizássemos o operador == para compará-los, receberíamos como resposta "Os objetos são iguais" ( ou True) como resposta.

O operadoris é chamado de identidade. Utilizando o operador is fosse utilizado nessa comparação, receberíamos como resposta "Os objetos são diferentes" como resposta. Afinal, os gemêos possuem uma identidade diferente, nome, preferências, humor, etc.

Todos sabem que eles são parecidos e possuem os mesmos atributos visuais como cor da pele, olhos, altura e etc. Mas não são a mesma pessoa, certo?
Na realidade, muitos gêmeos acabam buscando se diferenciar do irmão e acabam desenvolvendo personalidades completamente opostas.

Ok, agora vamos analisar um pouco de código e exemplos em python para verificarmos na prática o funcionamento desses conceitos.

Talvez esse exemplo clássico dos irmãos gêmeos não seja o melhor, mas é muito usado. Vamos ver alguns exemplos comparando inteiros e listas.

Cuidado com os inteiros pequenos ( Eles são "internalizados" no Python)

No nosso primeiro exemplo mostraremos a comparação entre duas variáveis (a e b) do tipo integer. As duas receberam o valor de 256. No nosso segundo exemplo atribuímos o valor de 257 para as variáveis c e d. Vejam as imagens abaixo. O resultado faz sentido pra você? Saberia explicar o comportamento?

Pegadinha?

256 é igual a 256

Em primeiro lugar, se você estiver interessado em comparar valores inteiros, você deve utilizar o operador de igualdade "==".

O operador de identidade irá realizar uma comparação entre os endereços de memória de cada variável, seria como se comparasse o "RG" de cada pessoa. Utilizar o "is" funciona da mesma maneira que um id(a)==id(b), onde a função id( ) retorna o endereço da memória de cada variável.

257 não é igual a 257, por que?

Em segundo lugar, nos bastidores, o Python internaliza
objetos com valores comumente utilizados (por exemplo, inteiros entre -5 e 256). Variáveis com esses valores apontam para o mesmo endereço de memória. Isso é utilizado para economizar memória.

Por esse motivo, o resultado da comparação entre as variáveis c e d é False para o operador is.

Não está acreditando? Teste na sua máquina e veja o resultado com outros valores menores que 256. In code we trust.

In code we trust.

A função id( ) retorna o endereço da memória para a variável. Esse valor é conhecido como a identidade da variável.

Vejam o endereços de cada variável abaixo:

Mesmo que c e d tenham o mesmo valor, elas são armazenadas em dois locais diferentes da memória.

Comparando duas listas

Nós iremos criar uma lista chamada de list_a a qual contém os elementos [1, 2, 3], e uma segunda lista chamada de list_b que receberá uma cópia dos elementos da variável list_a.

Utilizando o print podemos confirmar que ambas as variáveis possuem o mesmo conteúdo. Como elas parecem ser iguais, é esperado que o resultado seja True quando nós utilizarmos o operador == .

Para comparar se as duas variáveis estão apontando para o mesmo objeto, devemos utilizar o operador is . Esse comando irá confirmar que ambas as variáveis estão apontando para o somente um objeto lista. Isso já era esperado. Esse tipo de cópia faz isso mesmo. Inclusive se você alterar o conteúdo da list_a, ao printar o conteúdo da list_b você verá que o conteúdo também será alterado. Façam o teste.

Agora vamos cirar uma nova list chamada list_c utilizando o list()recebendo como parâmetro os elementos da list_a. Inclusive, você pode criar essa list_c com os valores diretamente através de uma atribuição como por exemplo list_c = [1,2,3].

Se olharmos para para list_c, o conteúdo é similar ao da list_a e list_b. Contudo, elas não tem a mesma identidade que as outras duas variáveis.

Na imagem acima conseguimos verificar que o operador == retorna True porque ambos possuem o mesmo conteúdo. Contudo, alist_c está armazenada em endereço diferente, portanto o operador de identidadeis retornará False como resultado.

Python está nos dizendo que list_c e list_a estão apontando para dois objetos diferentes, mesmo que o seu conteúdo seja igual

A figura abaixo mostra a outra forma de testar esse mesmo exemplo. Vejam os últimos prints com os endereços das variáveis.

Por último, preste atenção a forma como copia duas variáveis. O modo como você copia pode gerar apenas um ponteiro para a variável original. Alterar uma irá alterar a outra e isso pode ser um comportamento indesejado para você.

Utilizando os operadores corretos

Agora que nós entendemos a diferença entre == e is, vamos revisar quando utilizar cada um desses operadores.

Usando o operado de igualdade ( == )

A recomendação padrão é usar o == e o != para comparar valores. Há uma exceção em relação ao None. Na igualdade não estamos preocupados com o endereço de memória, nós apenas queremos comparar o conteúdo de duas variáveis.

Usando o de Identidade ( is )

Utilize esse operador para comparar a identidade de dois objetos, ou seja, a localização deles no espaço de endereçamento da memória, use os operadores is ou is not. Esses operadores são especialmente úteis para comparar variáveis com o None, para outros casos, evite-os.

Espero que esse artigo tenha ajudado no entendimento sobre esse assunto. As vezes o desenvolvedor vem de outra linguagem e acaba querendo utilizar algo que não se comportará da mesma maneira no Python. Caso tenha mais dúvidas, deixe um comentário ou mande uma mensagem no instagram @aprendadatascience.

--

--

Alex Barros

Engenheiro da Computação. Mestre e Doutorando em Computação Aplicada. Coordenador do Escritório de Projetos e Processos no TRT8.