Точный ответ: Нет Python не имеет один встроенный оператор , op
который может вылиться x = x or y
в x op y
.
Но это почти так. Побитовый оператор «или-равно» ( |=
) будет работать, как описано выше, если оба операнда обрабатываются как логические, с оговоркой. (Какое предупреждение? Ответ, конечно же, ниже.)
Во-первых, базовая демонстрация функциональности:
x = True
x
Out[141]: True
x |= True
x
Out[142]: True
x |= False
x
Out[143]: True
x &= False
x
Out[144]: False
x &= True
x
Out[145]: False
x |= False
x
Out[146]: False
x |= True
x
Out[147]: True
Предостережение связано с тем, что python не является строго типизированным, и, таким образом, даже если значения обрабатываются как логические в выражении, они не будут сокращены, если они переданы поразрядному оператору. Например, предположим, что у нас есть логическая функция, которая очищает список и возвращает, True
если были удалены элементы:
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
Теперь мы можем видеть короткое замыкание следующим образом:
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
Однако переключение на or
побитовое или ( |
) устраняет короткое замыкание, поэтому функция my_clear_list
выполняется.
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
Выше x = x | my_clear_list(lst)
эквивалентно x |= my_clear_list(lst)
.