Ответ 1
У Python есть два (среди прочих) встроенных объектов. Это просто объекты; в начале у них пока нет имен, но чтобы знать, о чем мы говорим, позвоните им 0x600D
и 0xBAD
.
Перед запуском Python (2.x) script имя True
привязывается к объекту 0x600D
, а имя False
привязывается к объекту 0xBAD
, поэтому, когда программа ссылается на True
, она смотрит на 0x600D
.
Поскольку 0x600D
и 0xBAD
знают, что они обычно используются именами True
и False
, то, что они выводят при печати, т.е. метод __str__
0x600D
возвращает 'True'
и т.д.
True = False
теперь связывает имя True
с другим объектом. Отныне оба имени True
и False
относятся к одному и тому же объекту 0xBAD
, который при печати выводит False
.
True = True
ничего не делает: он принимает объект, на который ссылается имя True
, и связывает новое (и старое) имя True
с этим объектом. Поскольку (из-за предыдущего шага) True
относится к 0xBAD
до этого, он по-прежнему относится к 0xBAD
после этого. Следовательно, печать все еще выводит False
.
True = not True
сначала берет объект, к которому привязано имя True
, которое равно 0xBAD
. Он предоставляет этот объект оператору not
. not
не заботится (или знает), какое имя используется здесь для обозначения 0xBAD
, оно просто знает, что при задании 0xBAD
он должен возвращать 0x600D
. Это возвращаемое значение затем присваивается оператору присваивания =
, привязывая к этому объекту имя True
.
Так как имя True
теперь еще раз ссылается на объект 0x600D
, вызов print True
выводит True
, и мир снова хорош.