Python ha questi due (e altri) oggetti incorporati. Sono solo oggetti; all'inizio, non hanno ancora alcun nome, ma per sapere a cosa ci riferiamo, chiamiamoli 0x600D
e 0xBAD
.
Prima di iniziare ad eseguire uno script Python (2.x), il nome True
viene legato all'oggetto 0x600D
, e il nome False
viene legato all'oggetto 0xBAD
, in modo che quando il programma si riferisce a True
, esamina 0x600D
.
Perché 0x600D
e 0xBAD
sanno che di solito vengono utilizzati con i nomi True
e False
, questo è quello che in uscita quando vengono stampate, vale a dire il metodo di 0x600D
rendimenti 'True'
e così via __str__
.
True = False
ora si lega il nome True
a un oggetto diverso. D'ora in poi, entrambi i nomi True
e False
si riferiscono allo stesso oggetto 0xBAD
, che, una volta stampato, emette False
.
True = True
in realtà non fa nulla: Ci vuole l'oggetto a cui si riferisce il nome True
, e si lega il nuovo (e vecchio) nome True
a questo oggetto. Poiché (a causa del passaggio precedente) True
fa riferimento a 0xBAD
prima, si riferisce ancora a 0xBAD
dopo questo. Quindi, stampa ancora uscite False
.
True = not True
prima prende l'oggetto che il nome True
è destinato a, che è 0xBAD
. Dà questo oggetto all'operatore not
. not
non importa (o sapere) quale nome è usato qui per fare riferimento a 0xBAD
, ma sa solo che quando viene dato 0xBAD
deve restituire 0x600D
.Questo valore di ritorno viene quindi assegnato all'operatore di assegnazione =
, vincolando il nome True
a questo oggetto.
Poiché il nome True
ora ancora una volta fa riferimento all'oggetto 0x600D
, chiamando print True
uscite True
, e il mondo è di nuovo bene.
non è che una buona battuta vecchio '#define vero false' in azione qui? – Amarghosh
Nella versione 3 l'asserzione True = False solleva un errore di sintassi, quindi suppongo che la tua domanda si riferisca alla versione 2 – jab
che cosa c'è di strano in questo? cura di elaborare? – ghostdog74