Jeśli to zrobię:
>>> False in [False, True]
True
To powraca True
. Po prostu dlatego, że False
jest na liście.
Ale jeśli to zrobię:
>>> not(True) in [False, True]
False
To powraca False
. Podczas gdy not(True)
jest równy False
:
>>> not(True)
False
Dlaczego?
python
python-2.7
python-3.x
Texom512
źródło
źródło
not(True) in [False, True]
Odpowiedzi:
Operator pierwszeństwo 2.x , 3.x . Pierwszeństwo
not
jest niższe niżin
. Jest to więc równoważne z:To jest to, czego chcesz:
Jak zauważa @Ben: Zaleca się, aby nigdy nie pisać
not(True)
, preferujnot True
. Ten pierwszy sprawia, że wygląda jak wywołanie funkcji, podczas gdynot
jest operatorem, a nie funkcją.źródło
not(True)
; wolęnot True
. Pierwszy sprawia, że wygląda jak wywołanie funkcji, stąd pochodzi twoje zamieszanie; gdybynot
była funkcją, tonot(True) in ...
nie mogłaby byćnot ((True) in ...)
. Musisz wiedzieć, że jest to operator (lub znajdziesz się w takich sytuacjach), więc powinieneś napisać go jak operator, a nie ukrywać go jako funkcję.a + b*c + d
jest w porządku, pisanie jest bardzo złea+b * c+d
. Tak samonot(True)
źle jest z tego powodu.not True
. NapiszFalse
zamiast tego.not True
, można by pisać coś takiegonot myfunc(x,y,z)
, gdziemyfunc
jest jakaś funkcja, która zwracaTrue
lubFalse
.not x in y
jest oceniany jakox not in y
Możesz dokładnie zobaczyć, co się dzieje, dezasemblując kod. Pierwszy przypadek działa zgodnie z oczekiwaniami:
Drugi przypadek ocenia na
True not in [False, True]
, coFalse
wyraźnie:Zamiast tego chciałeś wyrazić to
(not(True)) in [False, True]
, co zgodnie z oczekiwaniamiTrue
, i możesz zobaczyć, dlaczego:źródło
dis
ale jest to bardzo cenna odpowiedź, ponieważ pokazuje, że faktycznienot in
jest używanaPierwszeństwo operatora.
in
wiąże się mocniej niżnot
, więc twoje wyrażenie jest równoważnenot((True) in [False, True])
.źródło
Chodzi o pierwszeństwo operatora (
in
jest silniejsze niżnot
). Ale można to łatwo poprawić, dodając nawiasy we właściwym miejscu:pisanie:
jest taki sam jak:
który sprawdza, czy
True
znajduje się na liście i zwraca „nie” wyniku.źródło
Ocenia się jako
not True in [False, True]
, który zwraca,False
ponieważTrue
jest w[False, True]
Jeśli spróbujesz
Otrzymujesz oczekiwany wynik.
źródło
Wraz z innymi odpowiedziami, w których wspomniano o pierwszeństwie,
not
jest niższy niżin
, w rzeczywistości twoje stwierdzenie jest równoważne z:Ale zauważ, że jeśli nie oddzielisz swojego warunku od innych, Python użyje 2 ról (
precedence
lubchaining
) w celu ich oddzielenia, aw tym przypadku python użył pierwszeństwa. Pamiętaj również, że jeśli chcesz rozdzielić warunek, musisz umieścić wszystkie warunki w nawiasach, a nie tylko obiekt lub wartość:Ale jak wspomniano, istnieje kolejna modyfikacja Pythona w łańcuchach operatorów :
Na podstawie dokumentacji Pythona :
Na przykład wynikiem następującej instrukcji jest
False
:Ponieważ python będzie łączyć łańcuchy instrukcji w następujący sposób:
Co to dokładnie
False and True
jestFalse
.Możesz założyć, że centralny obiekt będzie współdzielony między 2 operacjami i innymi obiektami (w tym przypadku False).
I zauważ, że dotyczy to również wszystkich porównań, w tym testów członkostwa i operacji testów tożsamości, które są następującymi operandami:
Przykład:
Innym znanym przykładem jest zakres liczb:
co jest równe:
źródło
Zobaczmy to jako operację sprawdzania zamknięcia kolekcji:
[False, True]
to lista zawierająca niektóre elementy.True in [False, True]
Zwraca wyrażenieTrue
, podobnie jakTrue
element zawarty na liście.Dlatego
not True in [False, True]
daje „logiczne przeciwieństwo”,not
wynik powyższego wyrażenia (bez nawiasów dla zachowania pierwszeństwa, ponieważin
ma większy priorytet niżnot
operator). Dlategonot True
nastąpiFalse
.Z drugiej strony,
(not True) in [False, True]
jest równyFalse in [False, True]
, który jestTrue
(False
jest zawarty na liście).źródło
Aby wyjaśnić niektóre inne odpowiedzi, dodawanie nawiasów po jednoargumentowym operatorze nie zmienia jego pierwszeństwa.
not(True)
nienot
wiąże się ściślejTrue
. To tylko zbędny zestaw nawiasów wokółTrue
. To jest tak samo jak(True) in [True, False]
. Nawiasy nic nie robią. Jeśli chcesz, aby wiązanie było ściślejsze, musisz umieścić nawiasy wokół całego wyrażenia, co oznacza zarówno operatora, jak i operand, tj(not True) in [True, False]
.Aby zobaczyć to z innej perspektywy, zastanów się
**
wiąże się ściślej niż-
, dlatego otrzymujesz ujemny wynik dwóch kwadratów, a nie kwadrat ujemnych dwóch (co byłoby dodatnimi czterema).Co jeśli chcesz kwadrat dwóch ujemnych? Oczywiście dodajemy nawiasy:
Nie można jednak oczekiwać, że podadzą następujące informacje
4
ponieważ
-(2)
jest taki sam jak-2
. Nawiasy absolutnie nic nie robią.not(True)
jest dokładnie taki sam.źródło