Точный ответ: Нет. В 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)
.