Domanda

E 'garantito che False == 0 e True == 1, in Python (supponendo che essi non sono riassegnati dall'utente)? Per esempio, è in alcun modo garantito che il seguente codice produrrà sempre lo stesso risultato, qualunque sia la versione di Python (sia esistenti che, probabilmente, quelli futuri)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

Ogni riferimento alla documentazione ufficiale sarebbe molto apprezzato!

Modifica : Come osservato in molte risposte, eredita bool da int. La questione può quindi essere rifuso come: "Ha la documentazione ufficialmente dire che i programmatori possono contare su booleani che ereditano da numeri interi, con i valori 0 e 1 ?". Questa domanda è rilevante per la scrittura di codice robusto che non mancherà a causa di dettagli di implementazione!

È stato utile?

Soluzione

In Python 2.x questo è non garantita, poiché è possibile per True e False per essere riassegnati. Tuttavia, anche se questo accade, booleano Falso Vero e booleani sono ancora correttamente restituito per i confronti.

In Python 3.x True e False sono le parole chiave e saranno sempre uguale a 1 e 0.

In circostanze normali in Python 2, e sempre in Python 3:

oggetto False è di tipo bool che è una sottoclasse di int:

object
   |
 int
   |
 bool

E 'l'unica ragione per cui nel tuo esempio, ['zero', 'one'][False] funziona. Non funzionerebbe con un oggetto che non è una sottoclasse di numero intero, perché elenco indicizzazione funziona solo con numeri interi, o oggetti che definiscono una __index__ metodo (grazie mark-Dickinson ).

Modifica:

E 'vero la versione pitone corrente e di quella di Python 3. documentazione per Python 2.6 e la documentazione per Python 3 entrambi dicono:

  

Ci sono due tipi di interi: [...] interi (int) [...] booleani (bool)

e nella sottosezione booleana:

  

booleani: rappresentano i valori di verità False e True [...] booleano Valori si comportano come i valori 0 e 1, rispettivamente, in quasi tutti i contesti, l'eccezione è che quando convertito in una stringa, le stringhe "False" o "true" vengono restituiti rispettivamente.

C'è anche, per Python 2 :

  

In contesti numerici (per esempio quando usata come argomento per un operatore aritmetico), essi [False e True] si comportano come gli interi rispettivamente 0 e 1,.

Quindi booleani sono esplicitamente considerati come numeri interi in Python 2.6 e 3.

Quindi, sei al sicuro fino a quando Python 4 arriva. ; -)

Altri suggerimenti

Link alla PEP discutere il nuovo tipo bool in Python 2.3: http: // www.python.org/dev/peps/pep-0285/ .

Quando si converte un bool per un int, il valore intero è sempre 0 o 1, ma quando si converte un int ad un bool, il valore booleano è vero per tutti gli interi, tranne 0.

>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False

In Python 2.x, non è garantito a tutti:

>>> False = 5
>>> 0 == False
False

Così potrebbe cambiare. In Python 3.x, True, False, e nessuno è parole riservate , in modo che il codice di cui sopra non funzionerebbe.

In generale, con booleani si deve presumere che, mentre False avrà sempre un valore intero di 0 (fino a quando non si cambia, come sopra), True potrebbe avere qualsiasi altro valore. Io non necessariamente contare su alcuna garanzia che True==1, ma su Python 3.x, questo sarà sempre il caso, non importa quale.

Molto semplice. Come bool riferisce ad valutare un intero come bool, zero solo dà una risposta falsa. tutti i valori diversi da zero, galleggianti, numeri interi, compresi i numeri negativi, o quello che hai, restituirà true.

Un bel esempio del perché questo è utile è determinare lo stato di alimentazione di un dispositivo. On è qualsiasi valore diverso da zero, off è zero. Elettronicamente parlando questo ha un senso.

Per determinare vere o false relativamente tra i valori, è necessario avere qualcosa da confrontare. Questo vale per le stringhe e valori numerici, utilizzando == o != o <, > >=, <=, ecc.

È possibile assegnare un numero intero a una variabile e quindi ottenere vere o false in base a tale valore della variabile.

Basta int(False) di scrittura e si otterrà 0, se si digita int(True) il risultato sarà 1

False è un bool. Ha un tipo diverso. È un oggetto diverso da 0, che è un numero intero.

0 == False restituisce True perché False è lanciato in un intero. int restituisce (False) 0

La documentazione pitone dell'operatore == dice (aiuto ( '==')):

  

Gli operatori <, >, ==, >=, <=, e != confrontare i valori di due oggetti. Gli oggetti non devono avere lo stesso tipo. Se entrambi sono numeri, che vengono convertiti in un tipo comune.

come un falso conseguenza, viene convertito in un numero intero per la necessità del confronto. Ma è diverso da 0.

>>> 0 is False
False
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top