Операторы and
и or
поддерживают отложенную оценку или короткое замыкание.
В вашем первом примере:
[print(i) and print(i) for i in range(1)]
Сначала выполняется print(i)
, который записывает в стандартный вывод. Он ничего не возвращает (None
). Теперь python знает, что это выражение является частью операции and
. Поскольку None
имеет ложное логическое значение, нет смысла оценивать 2-е print
, поскольку первое из них потребуется для возврата истинного логического значения.
Со вторым:
[print(i) or print(i) for i in range(1)]
То же самое начинается. Так как or
, 2-й print
оценивается, потому что есть шанс, что он будет успешным. Вот почему два 0 пишутся на стандартный вывод.
Фактические результаты обоих теряются, поскольку понимание списка ни к чему не привязано. Результаты будут [None]
для обоих. 2 логических оператора проверяют логические значения, но также возвращают задействованные объекты.
При x and y
объект y
всегда возвращается.
С x or y
,
- , если
x
является "правдивым" объектом, возвращается x
- в противном случае
y
возвращается