Python tiene estos dos (entre otros) objetos incorporados. Son solo objetos; al principio, todavía no tienen ningún nombre, pero para saber a qué nos referimos, llamémoslos 0x600D
y 0xBAD
.
Antes de comenzar la ejecución de un script en Python (2.x), el nombre True
se enlaza con el objeto 0x600D
, y el nombre False
se enlaza con el objeto 0xBAD
, por lo que cuando el programa se refiere a True
, se ve en 0x600D
.
Debido 0x600D
y 0xBAD
saben que suelen ser utilizados por los nombres True
y False
, eso es lo que la salida cuando se imprimen, es decir, el método de 0x600D
vuelve 'True'
y así sucesivamente __str__
.
True = False
ahora se une el nombre True
a un objeto diferente. A partir de ahora, los nombres True
y False
se refieren al mismo objeto 0xBAD
, que, cuando se imprime, genera False
.
True = True
en realidad no hace nada: Se toma el objeto a que se refiere con el nombre True
, y se une al nuevo (y viejo) Nombre True
a este objeto. Dado que (debido al paso anterior) True
se refiere a 0xBAD
antes de esto, todavía se refiere a 0xBAD
después de esto. Por lo tanto, la impresión sigue emitiendo False
.
True = not True
primera toma el objeto de que el nombre True
está obligado a, que es 0xBAD
. Da este objeto al operador not
. not
no importa (o sabe) qué nombre se usa aquí para referirse a 0xBAD
, simplemente sabe que cuando se le da 0xBAD
debe devolver 0x600D
.Este valor de retorno se entrega al operador de asignación =
, vinculando el nombre True
a este objeto.
Desde el nombre True
ahora una vez más se refiere al objeto 0x600D
, llamando print True
salidas True
, y el mundo es bien otra vez.
no es tan buena broma vieja '#define cierto false' en acción aquí? – Amarghosh
En la versión 3, la asignación True = False provoca un error sintax, por lo que supongo que su pregunta se refiere a la versión 2 – jab
¿Qué tiene de extraño? ¿cuidado para elaborar? – ghostdog74