Python is e in

Você já conhece as comparações (==, <, >) e o and, o or e o not. Faltam dois operadores que também respondem com True ou False, e que são palavras, em vez de símbolos. O in (em inglês, "em", "dentro de") pergunta "isto está lá dentro?": a palavra "leite" está na lista de compras? O is (em inglês, "é") pergunta "é a mesma coisa?", e não só "é igual?". Parece um detalhe, mas confundir is com == é um dos erros mais comuns de quem começa.

Você vai aprender
  • A procurar um pedaço dentro de um texto com in, e a perguntar o contrário com not in.
  • Por que "Leite" in frase pode dar False quando a frase tem "leite".
  • Como o in funciona numa lista: ele procura o item inteiro.
  • A diferença entre == ("tem o mesmo valor?") e is ("é o mesmo objeto?").
  • O jeito certo de testar se algo é None: is None e is not None.
  • O aviso real que o Python dá quando você escreve idade is 1, e os erros reais do in.

A ideia: "está na sacola?" e "é a mesma sacola?"

A Ana voltou da padaria com uma sacola. A mãe pergunta: "o leite está na sacola?". Para responder, a Ana olha dentro da sacola e procura. Essa é a pergunta do in: "leite" in sacola.

Agora imagine que a Ana e a irmã, a Bia, compraram exatamente as mesmas coisas, em sacolas iguais. As duas sacolas são iguais (mesmo conteúdo), mas não são a mesma sacola: se a Ana comer o pão da sacola dela, a da Bia continua com pão. Já se a Ana disser "a sacola da casa é esta aqui" e apontar para a sacola dela, aí "a sacola da casa" e "a sacola da Ana" são a mesma sacola, com dois nomes.

OperadorPergunta que fazExemplo
inIsto está dentro daquilo?"leite" in frase
not inIsto não está dentro daquilo?"queijo" not in frase
==Os dois têm o mesmo valor? (sacolas iguais)lista_ana == lista_bia
isOs dois são o mesmo objeto? (a mesma sacola)lista_ana is lista_da_casa
is notOs dois não são o mesmo objeto?resposta is not None

1. in: procurando dentro de um texto

O uso mais simples do in é procurar um pedaço de texto dentro de outro texto. A Ana anotou o que precisa comprar numa frase:

frase = "Comprar pão, leite e café"

print("leite" in frase)
print("queijo" in frase)
print("queijo" not in frase)
"leite"
O pedaço que você está procurando. Fica à esquerda do in.
in
"Está dentro de?". Compara os dois lados e responde True (verdadeiro) ou False (falso).
frase
Onde procurar. Fica à direita do in.
not in
A pergunta ao contrário: "não está dentro de?". São duas palavras que funcionam juntas, como um operador só.
$ python3 busca.py
True
False
True

Linha por linha: "leite" aparece na frase, então True. "queijo" não aparece, então False. E "queijo" não está na frase? Verdade: True.

O in procura o pedaço em qualquer lugar do texto, até no meio de uma palavra. No modo interativo:

$ python3
Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> "an" in "banana"
True
>>> "ana" in "Ana Maria"
False
>>> exit()

"an" está dentro de "banana". Mas por que "ana" não está em "Ana Maria"? É o assunto da próxima seção.


2. Maiúsculas e acentos contam

Para o Python, "A" e "a" são letras diferentes, e "ã" e "a" também. O in procura o pedaço exatamente como você escreveu:

frase = "Comprar pão, leite e café"

print("Leite" in frase)
print("pao" in frase)
print("" in frase)
$ python3 maiusculas.py
False
False
True
  • "Leite", com L maiúsculo, não está na frase: lá está "leite", com l minúsculo.
  • "pao", sem til, não está: lá está "pão".
  • E o texto vazio, ""? Ele está dentro de qualquer texto. É uma curiosidade, mas vale saber: se um dia o in der True sem você esperar, confira se o pedaço procurado não ficou vazio.
Procurar sem ligar para maiúsculas

O jeito comum é deixar os dois lados em minúsculas antes de procurar: "leite" in frase.lower(). O .lower() (em inglês, "mais baixo", isto é, minúsculo) devolve o texto todo em minúsculas. Ele e os outros métodos de texto estão na aula Métodos de Texto.

Missão: o programa pergunta se o email tem ponto. Mude a pergunta para saber se ele tem arroba (@): troque o texto da mensagem para Tem arroba? e o "." por "@".

email = "ana@email.com"
print("Tem ponto?", "." in email)
email = "ana@email.com"
print("Tem arroba?", "@" in email)

Depois de cumprir a missão, apague o @ do email e rode de novo: a resposta vira False. É um teste (bem simples) que um site faz antes de aceitar o seu cadastro.


3. in numa lista: procura o item inteiro

Uma lista guarda vários valores em ordem, entre colchetes e separados por vírgula. Ela tem aulas próprias, a partir de Listas; aqui, só precisa saber que o in funciona nela também:

compras = ["pão", "leite", "café"]

print("leite" in compras)
print("arroz" in compras)
print("lei" in compras)
$ python3 compras.py
True
False
False

Repare na última linha. No texto, "lei" in "leite" daria True, porque o in procura pedaços. Na lista, o in pergunta "algum item da lista é igual a "lei"?". Os itens são "pão", "leite" e "café"; nenhum deles é "lei", então False.

Onde procuraO que o in perguntaExemploResultado
Num textoEste pedaço aparece em algum lugar do texto?"lei" in "leite"True
Numa listaAlgum item é igual a este valor?"lei" in ["pão", "leite"]False

4. is: é o mesmo objeto?

Agora o is. Para entender, você precisa saber de uma coisa sobre as variáveis: o nome não é o valor, ele aponta para o valor, como uma etiqueta presa num objeto (reveja a aula Variáveis se precisar). Duas etiquetas podem estar presas no mesmo objeto. É isso que o is pergunta. As sacolas da Ana e da Bia, em Python:

lista_ana = ["pão", "leite"]
lista_bia = ["pão", "leite"]
lista_da_casa = lista_ana

print(lista_ana == lista_bia)
print(lista_ana is lista_bia)
print(lista_ana is lista_da_casa)

lista_da_casa.append("café")
print(lista_ana)
print(lista_bia)
lista_ana = ["pão", "leite"]
Cria uma lista nova e prende nela a etiqueta lista_ana.
lista_bia = ["pão", "leite"]
Cria outra lista nova, com o mesmo conteúdo. São duas sacolas iguais.
lista_da_casa = lista_ana
Não cria lista nenhuma: prende mais uma etiqueta, lista_da_casa, na lista que lista_ana já aponta. Uma sacola, dois nomes.
==
"Têm o mesmo valor?" Compara o conteúdo.
is
"São o mesmo objeto?" Compara se as duas etiquetas estão presas na mesma coisa.
.append("café")
Acrescenta um item no fim da lista (aula Adicionando Itens). Está aqui só para provar quem é quem.
$ python3 identidade.py
True
False
True
['pão', 'leite', 'café']
['pão', 'leite']
  1. lista_ana == lista_bia é True: o conteúdo é o mesmo.
  2. lista_ana is lista_bia é False: são duas listas diferentes, que por acaso têm o mesmo conteúdo.
  3. lista_ana is lista_da_casa é True: as duas etiquetas estão na mesma lista.
  4. A prova: o café foi acrescentado pela etiqueta lista_da_casa, e apareceu em lista_ana (é a mesma sacola). A lista_bia não mudou.
No dia a dia, use ==

Quase sempre você quer saber se dois valores são iguais: se a senha digitada é a senha certa, se a nota é 10, se o nome é "Ana". Para isso, é ==. O is serve para uma pergunta bem mais rara, "é o mesmo objeto?", e para o None, que vem a seguir. Na dúvida, ==.

Esse assunto (duas etiquetas na mesma lista) volta com mais calma nas aulas Copiando Listas e Mutável × Imutável.


5. is None: o uso mais comum do is

O None é o valor que quer dizer "nada", "ainda não tem" (aula O Valor None). Só existe um None no programa inteiro: toda variável que vale None aponta para o mesmo objeto. Por isso, o jeito certo de perguntar "isto é None?" é com is:

resposta = None

print(resposta is None)
print(resposta is not None)

resposta = "sim"
print(resposta is None)
print(resposta is not None)
$ python3 nada.py
True
False
False
True

Enquanto resposta vale None, resposta is None é True. Depois que ela passa a valer "sim", vira False. O is not None faz a pergunta ao contrário: "já tem alguma coisa?".

E == None? Funciona, mas não se usa

$ python3
Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = None
>>> x is None
True
>>> x == None
True
>>> exit()

As duas dão True. Então por que preferir is? Dois motivos:

  • É a regra de estilo do Python (o PEP 8, que tem aula própria: Estilo de Código): comparações com None se fazem com is ou is not, nunca com ==. Quem lê o seu código espera isso.
  • O is não pode ser enganado. Mais adiante você vai criar os seus próprios tipos (aula Métodos Especiais) e vai ver que cada tipo pode decidir o que o == faz. Já o is só pergunta "é aquele objeto?", e ninguém muda isso.

Missão: o cadastro da Ana ainda não tem telefone. O programa testa isso com == None. Troque pela forma recomendada, com is.

telefone = None
print("Sem telefone?", telefone == None)
telefone = None
print("Sem telefone?", telefone is None)

6. not in e is not: a pergunta ao contrário

Você pode negar com o not na frente da pergunta inteira, ou usar as formas de duas palavras. O resultado é o mesmo:

telefone = None
email = "ana@email.com"

print(telefone is not None)
print(email is not None)
print(not email is None)
print("@" not in email)
print(not "@" in email)
$ python3 is-not.py
False
True
True
False
False

email is not None e not email is None deram a mesma resposta (True); "@" not in email e not "@" in email também (False). Mas as formas de duas palavras, is not e not in, leem como uma frase em inglês ("email is not None": "o email não é nada") e são as que o PEP 8 recomenda.


Formas diferentes de fazer a mesma pergunta

Você quer saber…UseFunciona, mas evitePor quê
se dois valores são iguaisa == ba is bO is pergunta outra coisa; pode dar False com valores iguais (veja Quando dá errado)
se algo é Nonex is Nonex == NoneRegra do PEP 8; o is não pode ser enganado
se algo não é Nonex is not Nonenot x is NoneLê melhor
se um pedaço não está no texto"@" not in emailnot "@" in emailLê melhor

Quando dá errado

is no lugar de ==: o aviso SyntaxWarning

A Ana quis saber se a idade é 1 e escreveu is, porque em inglês "idade é 1" se diz "idade is 1":

idade = 1
print(idade is 1)
print(idade == 1)
$ python3 is-numero.py
/home/ana/is-numero.py:2: SyntaxWarning: "is" with 'int' literal. Did you mean "=="?
  print(idade is 1)
True
True

O programa rodou, mas antes o Python deu um aviso (em inglês, warning). Um aviso não para o programa, como um erro pararia; ele diz "isto funciona, mas desconfio que não é o que você quer". Linha por linha:

/home/ana/is-numero.py:2:
Em qual arquivo e em qual linha (a 2) está o problema.
SyntaxWarning
"Aviso de sintaxe": o Python viu isso só de ler o código, antes de rodar.
"is" with 'int' literal.
"is com um número inteiro escrito direto no código" (literal é um valor escrito ali mesmo, como 1 ou "Ana").
Did you mean "=="?
"Você quis dizer ==?" A própria dica do conserto.
print(idade is 1)
A linha que causou o aviso, copiada para você ver.

Com is not o aviso também aparece, e sugere o != ("diferente"). Com texto acontece o mesmo, e o aviso muda para 'str' literal (str é o tipo dos textos). No modo interativo, o "arquivo" se chama <python-input-2>, que quer dizer "a terceira linha que você digitou" (a contagem começa no zero):

$ python3
Python 3.14.4 (main, Aug 20 2026, 10:41:58) [GCC 15.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> nome = "Ana"
>>> nome == "Ana"
True
>>> nome is "Ana"
<python-input-2>:1: SyntaxWarning: "is" with 'str' literal. Did you mean "=="?
True
>>> exit()

"Mas deu True! Qual o problema?" O problema é que deu True por sorte. Para economizar memória, o Python às vezes reaproveita o mesmo objeto para valores iguais, e às vezes não. Veja dois mil, um escrito direto no código e outro feito a partir de um texto com int() (aula Conversão de Tipos):

a = 1000
b = 1000
print(a is b)

c = int("1000")
d = int("1000")
print(c is d)
$ python3 mil2.py
True
False

Os quatro valem mil, e c == d seria True. Mas c is d deu False: o int() fabricou dois objetos separados. Imagine o número vindo do teclado, com input(): o is falharia "do nada". Como consertar: para comparar valores, sempre ==. Quando o Python mostrar Did you mean "=="?, ele tem razão.

Procurar dentro de um número

A Ana quer saber se o ano 2026 tem o algarismo 2:

codigo = 2026
print(2 in codigo)
$ python3 in-numero.py
Traceback (most recent call last):
  File "/home/ana/in-numero.py", line 2, in <module>
    print(2 in codigo)
          ^^^^^^^^^^^
TypeError: argument of type 'int' is not a container or iterable
Traceback (most recent call last):
"Rastro (a chamada mais recente por último)": o Python vai contar onde o erro aconteceu. A aula Lendo uma Mensagem de Erro detalha cada parte.
File "/home/ana/in-numero.py", line 2, in <module>
No arquivo in-numero.py, linha 2, no corpo principal do programa.
^^^^^^^^^^^
Os acentos circunflexos sublinham o pedaço exato que falhou: o 2 in codigo.
TypeError:
"Erro de tipo": a operação não serve para esse tipo de valor.
argument of type 'int' is not a container or iterable
"Um valor do tipo int (número inteiro) não é um recipiente nem algo que se percorra." Um número não tem "lá dentro" onde procurar: ele é um valor só, e não uma sequência de algarismos.

Como consertar: se você quer olhar os algarismos, transforme o número em texto: "2" in str(codigo).

Procurar um número dentro de um texto

Agora o código já é um texto, mas a Ana procurou o número 2:

codigo = "2026"
print(2 in codigo)
$ python3 in-texto-numero.py
Traceback (most recent call last):
  File "/home/ana/in-texto-numero.py", line 2, in <module>
    print(2 in codigo)
          ^^^^^^^^^^^
TypeError: 'in <string>' requires string as left operand, not int

'in <string>' requires string as left operand, not int: "o in num texto precisa de um texto do lado esquerdo, e não de um int". Dentro de um texto só há texto; o número 2 e o texto "2" são coisas diferentes para o Python. Como consertar: ponha o 2 entre aspas, "2" in codigo, ou converta com str(2) in codigo.

Missão: o programa quer saber se o código da senha tem o algarismo 7, mas dá TypeError. Conserte só a linha do print.

senha = "4750"
print(7 in senha)
senha = "4750"
print("7" in senha)

Referência rápida

EscritaPerguntaExemplo → resultado
a in ba está dentro de b?"lei" in "leite" → True
a not in ba não está dentro de b?"queijo" not in "pão e leite" → True
item in listaAlgum item da lista é igual a item?"lei" in ["pão", "leite"] → False
a is ba e b são o mesmo objeto?lista_ana is lista_bia → False
a is not ba e b não são o mesmo objeto?com resposta = "sim": resposta is not None → True
x is Nonex é o "nada"?O jeito certo de testar None
SintomaCausa provável
SyntaxWarning: "is" with 'int' literal. Did you mean "=="?is usado para comparar com um valor: troque por ==
TypeError: argument of type 'int' is not a container or iterablein com um número do lado direito: um número não tem "dentro"
TypeError: 'in <string>' requires string as left operand, not intNúmero procurado num texto: ponha entre aspas ou use str()
in deu False, mas a palavra está láMaiúsculas ou acentos diferentes; ou é uma lista e o item não é exatamente igual
is deu False com valores iguaisSão objetos diferentes com o mesmo valor: para valores, use ==

Exercícios

1. Tem café?

Complete para perguntar se "café" está dentro de frase:

print("café" frase)

2. Ainda não respondeu

Complete do jeito recomendado para perguntar se resposta ainda vale None:

print(resposta None)

3. Sem arroba

Complete com as duas palavras que perguntam "não está dentro?":

print("@" email)

4. Com frase = "Comprar pão, leite e café", quanto vale "Pão" in frase?

5. Com compras = ["pão", "leite", "café"], quanto vale "caf" in compras?

6. A Ana quer saber se a nota digitada é igual a 10. Qual escrever?

Missão final: a lista de convidados

Missão: a Ana montou a lista de convidados da festa e quer conferir se a Bia ficou de fora. Complete a segunda mensagem usando not in.

convidados = ["Ana", "Carla", "Davi", "Eduardo"]

print("O Davi foi convidado?", "Davi" in convidados)
print("A Bia ficou de fora?")
convidados = ["Ana", "Carla", "Davi", "Eduardo"]

print("O Davi foi convidado?", "Davi" in convidados)
print("A Bia ficou de fora?", "Bia" not in convidados)

Acrescente "Bia" à lista e rode de novo: a segunda resposta vira False.


Resumo

  • in pergunta "está dentro?"; not in, "não está dentro?". Os dois respondem True ou False.
  • Num texto, o in procura um pedaço em qualquer lugar, com maiúsculas e acentos exatos. Numa lista, ele procura um item inteiro igual.
  • == pergunta "mesmo valor?" (sacolas iguais); is pergunta "mesmo objeto?" (a mesma sacola). Para comparar valores, use sempre ==.
  • O uso certo do is no dia a dia: x is None e x is not None.
  • idade is 1 dá SyntaxWarning: "is" with 'int' literal. Did you mean "=="?: o Python tem razão, troque por ==.
  • Número não tem "dentro" (2 in 2026 dá TypeError), e num texto só se procura texto ("2" in "2026").