Czy False = = 0 i True = = 1 w Pythonie jest szczegółem implementacji, czy jest gwarantowany przez język?

Czy jest zagwarantowane, że False == 0 i True == 1, w Pythonie (zakładając, że nie są przypisane przez użytkownika)? Na przykład, czy jest w jakikolwiek sposób zagwarantowane, że poniższy kod zawsze przyniesie te same wyniki, niezależnie od wersji Pythona (zarówno istniejącej, jak i prawdopodobnie przyszłej)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'
Wszelkie odniesienia do oficjalnej dokumentacji będą mile widziane!

Edit : jak zauważono w wielu odpowiedziach, bool dziedziczy z int. Pytanie to można zatem przekształcić as: "czy dokumentacja oficjalnie mówi, że programiści mogą polegać na booleanach dziedziczących z liczb całkowitych, z wartościami 0 i 1?". To pytanie jest istotne przy pisaniu solidnego kodu, który nie zawiedzie ze względu na szczegóły implementacji!

Author: Eric Lebigot, 2010-05-04

6 answers

W Pythonie 2.x jest to nie gwarantowane, ponieważ możliwe jest ponowne przypisanie True i False. Jednak nawet jeśli tak się stanie, logiczne True i logiczne False są nadal poprawnie zwracane do porównań.

W Pythonie 3.x True i False są słowami kluczowymi i zawsze będą równe 1 i 0.

W normalnych okolicznościach w Pythonie 2 i zawsze w Pythonie 3:

False obiekt jest typu bool, który jest podklasą int:

object
   |
 int
   |
 bool

Jest jedyny powód, dla którego w twoim przykładzie ['zero', 'one'][False] działa. Nie będzie działać z obiektem, który nie jest podklasą integer, ponieważ indeksowanie listy działa tylko z liczbami całkowitymi lub obiektami, które definiują __index__ metoda (dzięki mark-dickinson ).

Edit:

Odnosi się to do obecnej wersji Pythona i Pythona 3. Docs for python 2.6 i docs for Python 3 mówią:

Istnieją dwa rodzaje liczb całkowitych: [...] Liczby całkowite (int) [...] Booleans (bool)

Oraz w podrozdziale boolean:

Booleans: przedstawiają one wartości prawdy False I True [...] Wartości logiczne zachowują się jak wartości 0 i 1, odpowiednio, w prawie wszystkich kontekstach, z wyjątkiem tego, że po przekonwertowaniu na łańcuch znaków zwracane są odpowiednio łańcuchy "False" lub "True".

Więc wartości logiczne są jawnie traktowane jako liczby całkowite w Pythonie 2.6 i 3.

Więc jesteś bezpieczny dopóki nie pojawi się Python 4. ;-)

 146
Author: Olivier Verdier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:27

Link do PEP omawiającego nowy typ bool w Pythonie 2.3: http://www.python.org/dev/peps/pep-0285/.

Podczas konwersji bool na int, wartość całkowita jest zawsze 0 LUB 1, ale podczas konwersji int na bool, wartość logiczna jest True dla wszystkich liczb całkowitych z wyjątkiem 0.

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
 62
Author: Erik Cederstrand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 09:16:50

W Pythonie 2.x, nie jest to w ogóle gwarantowane:

>>> False = 5
>>> 0 == False
False
Więc może się to zmienić. W Pythonie 3.x, True, False i None są słowami zastrzeżonymi, więc powyższy kod nie zadziała.

Ogólnie rzecz biorąc, z booleans należy założyć, że podczas gdy False zawsze będzie mieć wartość całkowitą równą 0 (tak długo, jak nie zmienisz jej, jak powyżej), True może mieć dowolną inną wartość. Nie musiałbym polegać na żadnej gwarancji, że True==1, ale na Pythonie 3.x, tak będzie zawsze, bez względu na co?

 21
Author: Daniel G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-04 09:36:55

Bardzo proste. Ponieważ bool odnosi się do oceny liczby całkowitej jako bool, tylko zero daje fałszywą odpowiedź. Wszystkie niezerowe wartości, pływki, liczby całkowite, w tym liczby ujemne, lub co masz, zwrócą true.

Miłym przykładem, dlaczego jest to przydatne, jest określenie stanu zasilania urządzenia. On to dowolna niezerowa wartość, off to zero. Elektronicznie to ma sens.

Aby określić wartość true lub false relatywnie pomiędzy wartościami, musisz mieć coś do porównania. To stosuje się do ciągów i wartości liczbowych, używając == 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.

 -1
Author: Kathy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 20:18:02

Po prostu napisz int(False) a otrzymasz 0, Jeśli wpiszesz int(True) to wyjdzie 1

 -2
Author: Harsh Rathee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 15:47:21

False to bool. Ma inny typ. Jest to inny obiekt od 0, który jest liczbą całkowitą.

0 == False zwraca True, ponieważ False jest rzucane na liczbę całkowitą. int (False) zwraca 0

Dokumentacja Pythona operatora = = says (help('==')):

Operatorzy <, >, ==, >=, <=, i != porównaj wartości dwóch obiektów. Obiekty nie muszą mieć tego samego typu. Jeśli obie są liczbami, są one konwertowane na typ wspólny.

Jako w konsekwencji False jest konwertowane do liczby całkowitej na potrzeby porównania. Ale różni się od 0.

>>> 0 is False
False
 -6
Author: luc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-21 10:56:59