Czy jest to zagwarantowane False == 0
i True == 1
w Pythonie (zakładając, że użytkownik nie przypisuje ich ponownie)? Na przykład, czy jest w jakikolwiek sposób gwarantowany, że poniższy kod zawsze będzie dawał takie same wyniki, bez względu na wersję Pythona (zarówno istniejące, jak i prawdopodobnie przyszłe)?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
Wszelkie odniesienia do oficjalnej dokumentacji będą mile widziane!
Edycja : jak zauważono w wielu odpowiedziach, bool
dziedziczy po int
. Pytanie może zatem zostać przekształcone w następujący sposób: „Czy dokumentacja oficjalnie mówi, że programiści mogą polegać na wynikach logicznych dziedziczących po liczbach całkowitych, z wartościami 0
i1
?”. To pytanie dotyczy pisania solidnego kodu, który nie zawiedzie z powodu szczegółów implementacji!
źródło
sum(bool_list)
. W przeciwnym razie będziesz musiał pisaćsum(1 for x bool_list if x)
.bool_list.count(True)
jest to bardziej wyraźne; jest także około 3 razy szybszy… :)Odpowiedzi:
W Pythonie 2.x nie jest to gwarantowane, ponieważ jest możliwe
True
iFalse
można je ponownie przypisać. Jednak nawet jeśli tak się stanie, wartość logiczna Prawda i wartość logiczna False są nadal poprawnie zwracane do porównań.W Pythonie 3.x
True
iFalse
są słowami kluczowymi i zawsze będą równe1
i0
.W normalnych okolicznościach w Python 2 i zawsze w Python 3:
False
obiekt jest typu,bool
który jest podklasąint
:Jest to jedyny powód, dla którego w twoim przykładzie
['zero', 'one'][False]
działa. Nie działałby z obiektem, który nie jest podklasą liczb całkowitych, ponieważ indeksowanie list działa tylko z liczbami całkowitymi lub obiektami, które definiują__index__
metodę (dzięki mark-dickinson ).Edytować:
Dotyczy to zarówno bieżącej wersji Pythona, jak i wersji Python 3. Zarówno dokumentacja Pythona 2.6, jak i dokumentacja Pythona 3 mówią:
oraz w podsekcji boolowskiej:
Istnieje również, w przypadku Python 2 :
Tak więc booleany są jawnie uważane za liczby całkowite w Pythonie 2.6 i 3.
Więc jesteś bezpieczny, dopóki nie pojawi się Python 4. ;-)
źródło
__index__
metodę może być używany jako indeks listy; nie tylko podklasyint
lublong
.a = True; True = 'i am an idiot'; a == True
=> Fałsz. Poza takim przeniesieniem wartości domyślne są znormalizowane jako 0 i 1 i uważam, że powszechną praktyką jest poleganie na tym; np. aby zindeksować tablicę dwuelementową, gdzie [0] zawiera fałszywy przypadek, [1] prawda.Link do PEP omawiającego nowy typ bool w Pythonie 2.3: http://www.python.org/dev/peps/pep-0285/ .
Podczas konwertowania wartości bool na liczbę całkowitą wartość całkowita wynosi zawsze 0 lub 1, ale podczas konwertowania liczby całkowitej na wartość boolową wartość logiczna ma wartość True dla wszystkich liczb całkowitych oprócz 0.
źródło
W Pythonie 2.x nie ma żadnej gwarancji:
Więc to może się zmienić. W Pythonie 3.x prawda, fałsz i brak są słowami zastrzeżonymi , więc powyższy kod nie zadziała.
Ogólnie rzecz biorąc, w przypadku wartości logicznych należy założyć, że chociaż wartość False będzie zawsze miała wartość całkowitą równą 0 (o ile jej nie zmienisz, jak wyżej), wartość True może mieć dowolną inną wartość. Niekoniecznie polegałbym na jakiejkolwiek gwarancji
True==1
, ale w przypadku Python 3.x zawsze tak będzie, bez względu na wszystko.źródło
Bardzo prosty. Ponieważ bool odnosi się do oceny liczby całkowitej jako bool, TYLKO zero daje fałszywą odpowiedź. WSZYSTKIE wartości niezerowe, zmiennoprzecinkowe, liczby całkowite, w tym liczby ujemne lub to, co masz, zwróci wartość true.
Dobrym przykładem tego, dlaczego jest to przydatne, jest określenie stanu zasilania urządzenia. On to dowolna wartość niezerowa, off to zero. Ma to sens elektroniczny.
Aby ustalić wartość true lub false względnie między wartościami, musisz mieć coś do porównania. Odnosi się to do łańcuchów i wartości liczbowych, za pomocą
==
lub!=
lub<
,>
>=
,<=
, itd.Możesz przypisać liczbę całkowitą do zmiennej, a następnie uzyskać wartość true lub false na podstawie tej wartości zmiennej.
źródło
Po prostu napisz,
int(False)
a dostaniesz0
, jeśli wpiszeszint(True)
, wyświetli1
źródło
int()
Fałsz to bool. Ma inny typ. Jest to obiekt inny niż 0, który jest liczbą całkowitą.
0 == False
zwraca True, ponieważ False jest rzutowany na liczbę całkowitą. int (False) zwraca 0Dokumentacja Pythona operatora == mówi (pomoc ('==')):
W związku z tym False jest konwertowany na liczbę całkowitą na potrzeby porównania. Ale różni się od 0.
źródło
bool
jest podklasąint
, więc w bardzo realnym sensie bool jest liczbą całkowitą. Na przykładisinstance(True, int)
zwraca True. A kontrola równości nie przekształca wartości bool na liczbę całkowitą, ponieważ konwersja nie jest konieczna: po prostu wywołujeint.__cmp__
bezpośrednio. Uwaga, żebool.__cmp__ is int.__cmp__
również oceniaTrue
.isinstance(True, int)
=> Prawda. Oznacza to, że True IS jest liczbą całkowitą i nie wymaga konwersji.while response is False
działał, iwhile response == False
nie zrobił ... Dzięki!0 is False
fałsz nic ci nie mówi. W interaktywnym interpretera, należy wprowadzićx = -10
, a następniey = -10
, po czymx is y
i że będzie również być fałszywe. To, że istnieją optymalizacje, w których interpreter Pythona ponownie wykorzystuje te same obiekty liczb całkowitych w pewnych okolicznościach (przechowywanie literałów całkowitych jako stałych, internowanie małych liczb całkowitych), nie oznacza, żeis
należy tego użyć, gdy chcesz przetestować równość wartości całkowitych .