Python: kolejność wyznaczania wartości logicznej

9-gru-2020

Wyrażenia logiczne w Pythonie są wyznaczane od lewej do prawej. Jeśli więc masz w if wyrażenie logiczne expr1 and expr2, to expr2 będzie wyliczane tylko wtedy jeśli expr1 ma wartość True. Jest to całkiem oczywiste z punktu widzenia optymalizacji liczby wykonywanych obliczeń – gdyby expr1 już miało wartość False, to nie ma sensu wyliczać wartości dla expr2, bo ostateczna wartość dla expr1 and expr2 to False!

Jednak informacja o kolejności wyznaczania wartości jest istotna. Popatrz na ten przykład:

i = 0
box = ['ab','bcd','cde']


while len(box[i])>0 and i < len(box):
   print(box[i])
   i += 1

Uruchomienie skryptu skończy się błędem

IndexError: list index out of range

Dlaczego? Bo w pewnym momencie i będzie wynosiło 3 i odwołanie do box[i] nie ma sensu.  Jeśli jednak zmieni się kolejność warunków w while:

i = 0
box = ['ab','bcd','cde']


while i < len(box) and len(box[i])>0:
   print(box[i])
   i += 1

To nim odwołamy się do box[i], najpierw odbędzie się sprawdzenie, czy i<len(box). To wyrażenie zwróci wartość False, a co za tym idzie nie odbędzie się obliczanie dla prawej części wyrażenia and.

Sprytne!

 

Komentarze są wyłączone

Autor: Rafał Kraik