O seguinte snippet é anotado com a saída ( como visto em ideone.com ):
print "100" < "2" # True
print "5" > "9" # False
print "100" < 2 # False
print 100 < "2" # True
print 5 > "9" # False
print "5" > 9 # True
print [] > float('inf') # True
print () > [] # True
Alguém pode explicar por que a saída é como tal?
Detalhes da implementação
- Esse comportamento é determinado pelas especificações de idioma ou depende dos implementadores?
- Existem diferenças entre as principais implementações do Python?
- Existem diferenças entre as versões da linguagem Python?
python
types
comparison
python-2.x
poligenelubricants
fonte
fonte
Respostas:
No manual python 2 :
Quando você solicita duas sequências ou dois tipos numéricos, a ordenação é feita da maneira esperada (ordenação lexicográfica para sequência, ordenação numérica para números inteiros).
Quando você solicita um tipo numérico e um não numérico, o tipo numérico é o primeiro.
Quando você solicita dois tipos incompatíveis em que nenhum deles é numérico, eles são ordenados pela ordem alfabética de seus nomes de tipos:
Uma exceção são as classes de estilo antigo que sempre vêm antes das classes de novo estilo.
Não há especificação de idioma . A referência de idioma diz:
Portanto, é um detalhe de implementação.
Não consigo responder a essa pergunta porque usei apenas a implementação oficial do CPython, mas existem outras implementações do Python, como o PyPy.
No Python 3.x, o comportamento foi alterado para que a tentativa de solicitar um número inteiro e uma sequência de caracteres gere um erro:
fonte
complex(1,0) > 'abc'
isFalse
butcomplex(1,0) > complex(0,0)
raises aTypeError
As cadeias são comparadas lexicograficamente e tipos diferentes são comparados pelo nome do seu tipo (
"int"
<"string"
). 3.x corrige o segundo ponto, tornando-os não comparáveis.fonte