Czy False = = 0 i True = = 1 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 może dlatego należy przekształcić jako: "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: Georgy, 2010-05-04

3 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 to 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 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".

Istnieje również dla Pythona 2:

W kontekstach numerycznych (np. gdy używany jest jako argument do operatora arytmetycznego), one [False I True] zachowują się jak liczby całkowite 0 i 1, odpowiednio.

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

Więc jesteś bezpieczny, dopóki nie pojawi się Python 4. ;-)
 200
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
2020-12-17 17:31:55

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
 80
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?

 22
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