Точну відповідь: Ні 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)
.