É garantido que False == 0
e True == 1
, em Python (assumindo que eles não foram reatribuídos pelo usuário)? Por exemplo, é de alguma forma garantido que o código a seguir sempre produzirá os mesmos resultados, independentemente da versão do Python (existente e, provavelmente, futura)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Qualquer referência à documentação oficial seria muito apreciada!
Editar : Como observado em muitas respostas, bool
herda de int
. A questão pode, portanto, ser reformulada como: "A documentação diz oficialmente que os programadores podem confiar em booleanos herdados de números inteiros, com os valores 0
e1
?". Esta pergunta é relevante para escrever código robusto que não falhará devido aos detalhes da implementação!
python
boolean
equality
language-specifications
Eric O Lebigot
fonte
fonte
sum(bool_list)
. Caso contrário, você teria que escreversum(1 for x bool_list if x)
.bool_list.count(True)
é mais explícito; é também sobre 3 vezes mais rápido ... :)Respostas:
No Python 2.x, isso não é garantido, pois é possível
True
eFalse
reatribuído. No entanto, mesmo se isso acontecer, o booleano True e o booleano False ainda serão retornados corretamente para comparações.Em Python 3.x
True
eFalse
são palavras-chave e será sempre igual a1
e0
.Sob circunstâncias normais no Python 2 e sempre no Python 3:
False
O objeto é do tipobool
que é uma subclasse deint
:É a única razão pela qual, no seu exemplo,
['zero', 'one'][False]
funciona. Não funcionaria com um objeto que não seja uma subclasse de número inteiro, porque a indexação de lista funciona apenas com números inteiros ou objetos que definem um__index__
método (obrigado mark-dickinson ).Editar:
É verdade para a versão atual do python e para a do Python 3. Os documentos para o python 2.6 e os documentos para o Python 3 dizem:
e na subseção booleana:
Há também, para Python 2 :
Portanto, os booleanos são explicitamente considerados como números inteiros no Python 2.6 e 3.
Então você estará seguro até o Python 4 aparecer. ;-)
fonte
__index__
método pode ser usado como um índice de lista; não apenas subclasses deint
oulong
.a = True; True = 'i am an idiot'; a == True
=> Falso. Além dessa reatribuição, os valores padrão são padronizados como 0 e 1, e acredito que é prática comum depender disso; por exemplo, para indexar em uma matriz de dois elementos, onde [0] contém o caso falso, [1] true.Link para o PEP discutindo o novo tipo de bool no Python 2.3: http://www.python.org/dev/peps/pep-0285/ .
Ao converter um booleano em um int, o valor inteiro é sempre 0 ou 1, mas ao converter um int em um booliano, o valor booleano é True para todos os números inteiros, exceto 0.
fonte
No Python 2.x, isso não é garantido:
Então isso pode mudar. No Python 3.x, True, False e None são palavras reservadas , portanto o código acima não funcionaria.
Em geral, com os booleanos, você deve assumir que, embora False sempre tenha um valor inteiro 0 (desde que você não o altere, como acima), True pode ter qualquer outro valor. Eu não confiaria necessariamente em nenhuma garantia de que
True==1
, mas no Python 3.x, esse sempre será o caso, não importa o quê.fonte
Muito simples. Como bool se refere à avaliação de um número inteiro como bool, ONLY zero fornece uma resposta falsa. TODOS os valores diferentes de zero, valores flutuantes, números inteiros, incluindo números negativos ou o que você possui, retornará true.
Um bom exemplo de por que isso é útil é determinar o status de energia de um dispositivo. On é qualquer valor diferente de zero, off é zero. Eletronicamente, isso faz sentido.
Para determinar verdadeiro ou falso relativamente entre valores, você deve ter algo para compará-lo. Isto aplica-se a cadeias e valores numéricos, usando
==
ou!=
ou<
,>
>=
,<=
, etc.Você pode atribuir um número inteiro a uma variável e, em seguida, obter verdadeiro ou falso com base nesse valor de variável.
fonte
Basta escrever
int(False)
e você receberá0
, se você digitar,int(True)
ele produzirá1
fonte
int()
, com um significado numérico simples, não que eles são exatamente iguais a 0 e 1.Falso é um bool. Tem um tipo diferente. É um objeto diferente de 0, que é um número inteiro.
0 == False
retorna True porque False é convertido em um número inteiro. int (False) retorna 0A documentação python do operador == diz (help ('==')):
Como conseqüência, False é convertido em um número inteiro para a necessidade da comparação. Mas é diferente de 0.
fonte
bool
é uma subclasse deint
, portanto, em um sentido muito real, um bool é um número inteiro. Por exemplo,isinstance(True, int)
retorna True. E a verificação de igualdade não converte o booleano em int, pois nenhuma conversão é necessária: simplesmente chamaint.__cmp__
diretamente. Observe quebool.__cmp__ is int.__cmp__
também é avaliado comoTrue
.isinstance(True, int)
=> Verdadeiro. Ou seja, True IS é um número inteiro e não requer conversão.while response is False
funcionado ewhile response == False
não ... Obrigado!0 is False
é falso não diz nada. No seu intérprete interativo, digitex = -10
, entãoy = -10
, entãox is y
e isso também será falso. Só porque existem otimizações no local em que o intérprete Python reutiliza os mesmos objetos inteiros em determinadas circunstâncias (armazenar literais inteiros como constantes, inserir inteiros pequenos) não significa queis
deve ser usado quando você deseja testar a igualdade de valor inteiro .