Python имеет эти два (среди прочих) встроенных объекта. Они просто объекты; в начале у них еще нет имен, но чтобы знать, к чему мы обращаемся, давайте назовем их 0x600D
и 0xBAD
.
Перед началом выполнения скрипта Python (2.x) имя 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
, и мир снова становится хорошим.