Eu tenho um programa Python onde duas variáveis são definidas para o valor 'public'
. Em uma expressão condicional, tenho a comparação var1 is var2
que falha, mas se eu a alterar, var1 == var2
ela retornará True
.
Agora, se eu abrir meu interpretador Python e fizer a mesma comparação "is", ele será bem-sucedido.
>>> s1 = 'public'
>>> s2 = 'public'
>>> s2 is s1
True
O que estou perdendo aqui?
input = raw_input("Decide (y/n): ")
. Nesse caso, uma entrada de "y" eif input == 'y':
retornará "True" enquantoif input is 'y':
retornará False.Respostas:
is
é teste de identidade,==
é teste de igualdade. o que acontece no seu código seria emulado no intérprete assim:então, não é de admirar que eles não sejam os mesmos, certo?
Em outras palavras:
is
é oid(a) == id(b)
fonte
==
vs.equals()
em Java. A melhor parte é que o Python==
não é análogo ao Java==
.None
valor. Portanto, sempre tem o mesmo ID.Outras respostas aqui estão corretas:
is
é usada para comparação de identidade , enquanto==
é usada para comparação de igualdade . Como você se preocupa com a igualdade (as duas cadeias devem conter os mesmos caracteres), nesse caso, ois
operador está simplesmente errado e você deve usá-lo==
.A razão pela qual
is
funciona interativamente é que (a maioria) literais de string são internados por padrão. Da Wikipedia:Portanto, quando você tem duas literais de string (palavras que são literalmente digitadas no código-fonte do programa, entre aspas) no programa que possuem o mesmo valor, o compilador Python internará automaticamente as strings, tornando-as armazenadas da mesma forma localização da memória. (Observe que isso nem sempre acontece, e as regras para quando isso acontece são bastante complicadas; portanto, não confie nesse comportamento no código de produção!)
Como na sua sessão interativa, ambas as seqüências são realmente armazenadas no mesmo local de memória, elas têm a mesma identidade , portanto o
is
operador trabalha conforme o esperado. Mas se você construir uma string por outro método (mesmo que ela contenha exatamente os mesmos caracteres), a string poderá ser igual , mas não será a mesma string - ou seja, ela terá uma identidade diferente , porque é armazenado em um local diferente na memória.fonte
==
e comis
base no tipo de verificação que você deseja. Se você se preocupa com as seqüências de caracteres iguais (ou seja, com o mesmo conteúdo), use sempre==
. Se você se importa se dois nomes de Python se referem à mesma instância de objeto, você deve usaris
. Pode ser necessáriois
se você estiver escrevendo um código que lide com muitos valores diferentes sem se importar com o conteúdo deles, ou se souber que existe apenas um de algo e desejar ignorar outros objetos que fingem ser esse. Se você não tiver certeza, sempre escolha==
.A
is
palavra-chave é um teste para a identidade do objeto, enquanto==
é uma comparação de valores.Se você usar
is
, o resultado será verdadeiro se e somente se o objeto for o mesmo objeto. No entanto,==
será verdade sempre que os valores do objeto forem os mesmos.fonte
Uma última coisa a observar, você pode usar a
sys.intern
função para garantir que você esteja obtendo uma referência para a mesma string:Como indicado acima, você não deve usar
is
para determinar a igualdade de cadeias. Mas isso pode ser útil para saber se você tem algum tipo de requisito estranho de usaris
.Observe que a
intern
função costumava ser embutida no Python 2, mas foi movida para osys
módulo no Python 3.fonte
is
é teste de identidade,==
é teste de igualdade. O que isso significa é queis
é uma maneira de verificar se duas coisas são iguais ou apenas equivalentes.Digamos que você tenha um
person
objeto simples . Se ele é chamado de 'Jack' e tem '23' anos, é equivalente a outro Jack de 23 anos, mas não é a mesma pessoa.Eles têm a mesma idade, mas não são a mesma instância de pessoa. Uma string pode ser equivalente a outra, mas não é o mesmo objeto.
fonte
jack1.age = 99
, isso não mudarájack2.age
. Isso ocorre porque são duas instâncias diferentesjack1 is not jack2
. No entanto, eles podem se igualarjack1 == jack2
se o nome e a idade forem iguais. Fica mais complicado para as strings, porque as strings são imutáveis no Python, e o Python geralmente reutiliza a mesma instância. Eu gosto dessa explicação porque ela usa os casos simples (um objeto normal) e não os casos especiais (strings).Esta é uma observação lateral, mas no python idiomático, você verá frequentemente coisas como:
Isso é seguro, porque é garantido que haja uma instância do Objeto Nulo (ou seja, Nenhum) .
fonte
Se você não tiver certeza do que está fazendo, use o '=='. Se você tiver um pouco mais de conhecimento, poderá usar 'is' para objetos conhecidos como 'None'.
Caso contrário, você acabará se perguntando por que as coisas não funcionam e por que isso acontece:
Não tenho certeza se algumas coisas são garantidas para permanecerem iguais entre diferentes versões / implementações do python.
fonte
Da minha experiência limitada com python,
is
é usado para comparar dois objetos para ver se eles são o mesmo objeto, em oposição a dois objetos diferentes com o mesmo valor.==
é usado para determinar se os valores são idênticos.Aqui está um bom exemplo:
s1
é uma string unicode es2
é uma string normal. Eles não são do mesmo tipo, mas têm o mesmo valor.fonte
Eu acho que tem a ver com o fato de que, quando a comparação 'é' avaliada como falsa, dois objetos distintos são usados. Se for avaliada como verdadeira, significa que internamente está usando o mesmo objeto exato e não criando um novo, possivelmente porque você os criou em uma fração de 2 segundos ou mais e porque não há um grande intervalo de tempo entre otimizado e usa o mesmo objeto.
É por isso que você deve usar o operador de igualdade
==
, nãois
para comparar o valor de um objeto de sequência.Neste exemplo, criei s2, que era um objeto de string diferente anteriormente igual a 'one', mas não é o mesmo objeto
s
porque, porque o intérprete não usou o mesmo objeto que eu não o atribua inicialmente a 'one', se eu tivesse, teria feito do mesmo objeto.fonte
.replace()
como exemplo neste contexto provavelmente não é o melhor, porque sua semântica pode ser confusa.s2 = s2.replace()
vai sempre criar um novo objeto string, atribuir o novo objeto string paras2
, em seguida, descartar o objeto string ques2
usado para apontar para. Portanto, mesmo que você o fizesses = s.replace('one', 'one')
, ainda receberia um novo objeto de string.Eu acredito que isso é conhecido como seqüências "internadas". O Python faz isso, o Java e o C e C ++ ao compilar nos modos otimizados.
Se você usar duas cadeias idênticas, em vez de desperdiçar memória criando dois objetos de cadeia, todas as cadeias internas com o mesmo conteúdo apontam para a mesma memória.
Isso resulta no operador Python "is" retornando True, porque duas cadeias com o mesmo conteúdo estão apontando para o mesmo objeto. Isso também acontecerá em Java e em C.
Isso é útil apenas para economia de memória. Você não pode confiar nele para testar a igualdade de cadeias, porque os vários intérpretes e compiladores e mecanismos JIT nem sempre podem fazê-lo.
fonte
Estou respondendo à pergunta mesmo que a pergunta seja antiga, porque nenhuma resposta acima cita a referência de idioma
Na verdade, o operador is verifica a identidade e == operador verifica a igualdade,
Referência da linguagem:
Os tipos afetam quase todos os aspectos do comportamento do objeto. Até a importância da identidade do objeto é afetada em algum sentido: para tipos imutáveis, operações que computam novos valores podem realmente retornar uma referência a qualquer objeto existente com o mesmo tipo e valor, enquanto que para objetos mutáveis isso não é permitido . Por exemplo, depois de a = 1; b = 1, aeb pode ou não se referir ao mesmo objeto com o valor um, dependendo da implementação, mas depois de c = []; d = [], c e d são garantidos para se referir a duas listas vazias diferentes, exclusivas e recém-criadas. (Observe que c = d = [] atribui o mesmo objeto a c e d.)
portanto, da declaração acima, podemos inferir que as seqüências de caracteres que são do tipo imutável podem falhar quando marcadas com "é" e podem ser bem-sucedidas quando marcadas com "é"
O mesmo se aplica para int, tupla, que também são tipos imutáveis
fonte
A
==
equivalência do valor do teste do operador. Ois
operador testa a identidade do objeto, o Python testa se os dois são realmente o mesmo objeto (ou seja, vivem no mesmo endereço na memória).Neste exemplo, o Python criou apenas um objeto de string e os dois
a
eb
se refere a ele. O motivo é que o Python armazena e reutiliza internamente algumas seqüências de caracteres como uma otimização; na verdade, existe apenas uma string 'banana' na memória, compartilhada por aeb; Para disparar o comportamento normal, você precisa usar seqüências mais longas:Ao criar duas listas, você obtém dois objetos:
Nesse caso, diríamos que as duas listas são equivalentes, porque têm os mesmos elementos, mas não são idênticas, porque não são o mesmo objeto. Se dois objetos são idênticos, eles também são equivalentes, mas se forem equivalentes, não são necessariamente idênticos.
Se
a
se refere a um objeto e você atribuib = a
, as duas variáveis se referem ao mesmo objeto:fonte
is
irá comparar a localização da memória. É usado para comparação em nível de objeto.==
irá comparar as variáveis no programa. É usado para verificar em um nível de valor.is
verifica a equivalência no nível do endereço==
verifica a equivalência no nível do valorfonte
is
é teste de identidade,==
é teste de igualdade (consulte a documentação do Python ).Na maioria dos casos, se
a is b
, entãoa == b
. Mas há exceções, por exemplo:Portanto, você só pode usar
is
para testes de identidade, nunca para testes de igualdade.fonte