Итак, чтобы объединить то, что я считаю лучшим из всех ответов:
Когда вы оцениваете переменную в логическом контексте, вызывается ее метод .true (). Метод .true () по умолчанию, используемый объектом, выполняет проверку значения объекта в стиле <0, "", undef> в Perl, но когда вы говорите "но True" или "но False", этот метод переопределяется с помощью тот, который не смотрит на значение, просто возвращает константу.
Можно было бы написать метод true (), который, скажем, возвращал true, когда значение было четным, и false, когда оно было нечетным.