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.
- A procurar um pedaço dentro de um texto com
in, e a perguntar o contrário comnot in. - Por que
"Leite" in frasepode darFalsequando a frase tem "leite". - Como o
infunciona numa lista: ele procura o item inteiro. - A diferença entre
==("tem o mesmo valor?") eis("é o mesmo objeto?"). - O jeito certo de testar se algo é
None:is Noneeis not None. - O aviso real que o Python dá quando você escreve
idade is 1, e os erros reais doin.
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.
| Operador | Pergunta que faz | Exemplo |
|---|---|---|
in | Isto está dentro daquilo? | "leite" in frase |
not in | Isto não está dentro daquilo? | "queijo" not in frase |
== | Os dois têm o mesmo valor? (sacolas iguais) | lista_ana == lista_bia |
is | Os dois são o mesmo objeto? (a mesma sacola) | lista_ana is lista_da_casa |
is not | Os 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) ouFalse(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 oinderTruesem você esperar, confira se o pedaço procurado não ficou vazio.
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 procura | O que o in pergunta | Exemplo | Resultado |
|---|---|---|---|
| Num texto | Este pedaço aparece em algum lugar do texto? | "lei" in "leite" | True |
| Numa lista | Algum 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 quelista_anajá 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']
lista_ana == lista_biaéTrue: o conteúdo é o mesmo.lista_ana is lista_biaéFalse: são duas listas diferentes, que por acaso têm o mesmo conteúdo.lista_ana is lista_da_casaéTrue: as duas etiquetas estão na mesma lista.- A prova: o café foi acrescentado pela etiqueta
lista_da_casa, e apareceu emlista_ana(é a mesma sacola). Alista_bianão mudou.
==
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
Nonese fazem comisouis not, nunca com==. Quem lê o seu código espera isso. - O
isnã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á oissó 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… | Use | Funciona, mas evite | Por quê |
|---|---|---|---|
| se dois valores são iguais | a == b | a is b | O is pergunta outra coisa; pode dar False com valores iguais (veja Quando dá errado) |
se algo é None | x is None | x == None | Regra do PEP 8; o is não pode ser enganado |
se algo não é None | x is not None | not x is None | Lê melhor |
| se um pedaço não está no texto | "@" not in email | not "@" in email | Lê 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.
- "
iscom um número inteiro escrito direto no código" (literal é um valor escrito ali mesmo, como1ou"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.
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).
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
| Escrita | Pergunta | Exemplo → resultado |
|---|---|---|
a in b | a está dentro de b? | "lei" in "leite" → True |
a not in b | a não está dentro de b? | "queijo" not in "pão e leite" → True |
item in lista | Algum item da lista é igual a item? | "lei" in ["pão", "leite"] → False |
a is b | a e b são o mesmo objeto? | lista_ana is lista_bia → False |
a is not b | a e b não são o mesmo objeto? | com resposta = "sim": resposta is not None → True |
x is None | x é o "nada"? | O jeito certo de testar None |
| Sintoma | Causa 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 iterable | in com um número do lado direito: um número não tem "dentro" |
TypeError: 'in <string>' requires string as left operand, not int | Nú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 iguais | São objetos diferentes com o mesmo valor: para valores, use == |
Exercícios
1. Tem café?
Complete para perguntar se "café" está dentro de frase:
2. Ainda não respondeu
Complete do jeito recomendado para perguntar se resposta ainda vale None:
3. Sem arroba
Complete com as duas palavras que perguntam "não está dentro?":
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
inpergunta "está dentro?";not in, "não está dentro?". Os dois respondemTrueouFalse.- Num texto, o
inprocura 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);ispergunta "mesmo objeto?" (a mesma sacola). Para comparar valores, use sempre==.- O uso certo do
isno dia a dia:x is Noneex is not None. idade is 1dáSyntaxWarning: "is" with 'int' literal. Did you mean "=="?: o Python tem razão, troque por==.- Número não tem "dentro" (
2 in 2026dáTypeError), e num texto só se procura texto ("2" in "2026").