W Pythonie (sprawdzałem tylko z Pythonem 3.6, ale uważam, że powinno to wytrzymać również wiele poprzednich wersji):
(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
Ale:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True
Dlaczego wynik różni się w obu podejściach? Czy operator równości obsługuje krotki inaczej?
źródło
,
wiąże się mniej ściśle niż==
.To, co widzisz we wszystkich trzech przypadkach, jest konsekwencją specyfikacji gramatycznej języka i sposobu, w jaki tokeny napotkane w kodzie źródłowym są analizowane w celu wygenerowania drzewa parsowania.
Spojrzenie na ten kod niskiego poziomu powinno pomóc ci zrozumieć, co dzieje się pod maską. Możemy wziąć te instrukcje Pythona, przekonwertować je na kod bajtowy, a następnie zdekompilować za pomocą
dis
modułu:Przypadek 1:
(0, 0) == 0, 0
(0, 0)
jest najpierw porównywany z0
pierwszym i oceniany doFalse
. Następnie tworzona jest krotka z tym wynikiem i ostatnim0
, więc otrzymujesz(False, 0)
.Przypadek 2:
0, 0 == (0, 0)
Krotka jest konstruowana z
0
pierwszym elementem. W przypadku drugiego elementu wykonywane jest to samo sprawdzenie, co w pierwszym przypadku i ocenianeFalse
, więc otrzymujesz(0, False)
.Przypadek 3:
(0, 0) == (0, 0)
Tutaj, jak widzisz, po prostu porównujesz te dwie
(0, 0)
krotki i zwracaszTrue
.źródło
Inny sposób wyjaśnienia problemu: prawdopodobnie znasz dosłowne słownikowe
i literały tablicowe
i literały krotki
ale nie zdajesz sobie sprawy z tego, że w przeciwieństwie do literałów słownikowych i tablicowych, nawiasy, które zwykle widzisz wokół literału krotki, nie są częścią składni literału . Dosłowna składnia krotek to po prostu sekwencja wyrażeń oddzielonych przecinkami:
(„lista wyrażeń” w języku gramatyki formalnej dla Pythona ).
Czego oczekujesz od literału tablicowego
oceniać? To prawdopodobnie wygląda bardziej tak, jak powinno być takie samo jak
który oczywiście jest oceniany do
[0, False]
. Podobnie z jawnie umieszczonym w nawiasach literałem krotkinie jest to zaskakujące
(0, False)
. Ale nawiasy są opcjonalne;to to samo. I dlatego otrzymujesz
(0, False)
.Jeśli zastanawiasz się, dlaczego nawiasy wokół literału krotki są opcjonalne, dzieje się tak głównie dlatego, że byłoby to denerwujące, gdyby trzeba było pisać zadania niszczące w ten sposób:
źródło
Dodanie kilku nawiasów wokół kolejności wykonywania czynności może pomóc w lepszym zrozumieniu wyników:
Przecinek służy do oddzielania wyrażeń (używając nawiasów możemy oczywiście wymusić inne zachowanie). Podczas przeglądania wymienionych fragmentów przecinek
,
oddzieli je i określi, które wyrażenia zostaną ocenione:Krotkę
(0, 0)
można również podzielić w podobny sposób. Przecinek oddziela dwa wyrażenia składające się z literałów0
.źródło
W pierwszym Python tworzy krotkę dwóch rzeczy:
(0, 0) == 0
, którego wynikiem jestFalse
0
W drugim jest odwrotnie.
źródło
spójrz na ten przykład:
wynik:
następnie porównanie działa tylko z pierwszą liczbą (0 i r) w przykładzie.
źródło