Em Python (verifiquei apenas com Python 3.6, mas acredito que deve valer para muitas das versões anteriores também):
(0, 0) == 0, 0 # results in a two element tuple: (False, 0)
0, 0 == (0, 0) # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True
Mas:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
Por que o resultado difere entre as duas abordagens? O operador de igualdade lida com tuplas de maneira diferente?
fonte
,
vincula menos fortemente do que==
.O que você vê em todas as 3 instâncias é uma consequência da especificação gramatical da linguagem e como os tokens encontrados no código-fonte são analisados para gerar a árvore de análise.
Dar uma olhada neste código de baixo nível deve ajudá-lo a entender o que acontece nos bastidores. Podemos pegar essas instruções python, convertê-las em código de bytes e, em seguida, descompilá-las usando o
dis
módulo:Caso 1:
(0, 0) == 0, 0
(0, 0)
é primeiro comparado com0
primeiro e avaliado paraFalse
. Uma tupla é então construída com este resultado e por último0
, então você obtém(False, 0)
.Caso 2:
0, 0 == (0, 0)
Uma tupla é construída com
0
o primeiro elemento. Para o segundo elemento, a mesma verificação é feita como no primeiro caso e avaliada paraFalse
, então você obtém(0, False)
.Caso 3:
(0, 0) == (0, 0)
Aqui, como você pode ver, você está apenas comparando essas duas
(0, 0)
tuplas e retornandoTrue
.fonte
Outra maneira de explicar o problema: você provavelmente está familiarizado com literais de dicionário
e literais de matriz
e literais de tupla
mas o que você não percebe é que, ao contrário dos literais de dicionário e array, os parênteses que você geralmente vê ao redor de um literal de tupla não fazem parte da sintaxe literal . A sintaxe literal para tuplas é apenas uma sequência de expressões separadas por vírgulas:
(uma "exprlist" na linguagem da gramática formal para Python ).
Agora, o que você espera do literal de array
avaliar para? Isso provavelmente parece muito mais que deveria ser o mesmo que
que, claro, avalia para
[0, False]
. Da mesma forma, com um literal de tupla explicitamente entre parêntesesnão é surpreendente conseguir
(0, False)
. Mas os parênteses são opcionais;É a mesma coisa. E é por isso que você consegue
(0, False)
.Se você está se perguntando por que os parênteses em torno de um literal de tupla são opcionais, é principalmente porque seria irritante ter que escrever atribuições de desestruturação dessa maneira:
fonte
Adicionar alguns parênteses em torno da ordem em que as ações são realizadas pode ajudá-lo a compreender melhor os resultados:
A vírgula é usada para separar expressões (usando parênteses podemos forçar comportamentos diferentes, é claro). Ao visualizar os snippets que você listou, a vírgula
,
os separará e definirá quais expressões serão avaliadas:A tupla
(0, 0)
também pode ser dividida de maneira semelhante. A vírgula separa duas expressões compostas de literais0
.fonte
No primeiro Python está fazendo uma tupla de duas coisas:
(0, 0) == 0
, que avalia paraFalse
0
No segundo, é o contrário.
fonte
veja este exemplo:
então o resultado:
então, a comparação apenas faz com o primeiro número (0 e r) no exemplo.
fonte