[Zadanie rekrutacyjne 7] Czy tuple w pythonie są naprawdę niemutowalne

Data publikacji: 2016-04-19 | Tagi:

Takie małe i podchwytliwe pytanie.

Oczywiście odpowiedź brzmi: tak. Ale co się stanie po wykonaniu przykładowych fragmentów kodu.

a = [1, 2]
t = (1, 2, a, 3, 4)

print t  # (1, 2, [1, 2], 3, 4)

a.append(3)

print t  # (1, 2, [1, 2, 3], 3, 4)

Tworzymy dwa obiekty: listę i tuplę. Jednym z elementów tupli jest stworzona wcześniej lista. Do listy dodajemy element i wyświetlamy tuplę, okazuje się, że tupla "powiększyła się", mimo że powinna zostać niemutowalna.

To oczywiście pułapka na nieostrożnych, bo tupla składa się (tak jak wcześniej się składała), z dwóch intów, jednej listy i kolejnych dwóch intów. Czyli się nie zmieniła. Zmieniła się za to lista. Być może lepiej zobrazuje to wizualnie serwis pythontutor.

Kolejny przypadek potrafi wpędzić w krzaki nawet zaawansowanego programistę.

t = (1, 2, [1, 2], 3, 4)

print t  # (1, 2, [1, 2], 3, 4)

print t[2]  # [1, 2]

t[2] += [3, ]

print t  # (1, 2, [1, 2, 3], 3, 4)

Po wykonaniu konkatenacji t[2] += [3, ] dostaniemy komunikat o błędzie:

TypeError: 'tuple' object does not support item assignment

Ale po wyświetleniu naszej testowej tupli mamy już zgoła inny wynik. Lepiej widać to oczywiście na pythontutor, gdzie wprawdzie wykonanie zatrzymuje się na rzucanym wyjątku, ale wynik pozostaje taki sam. Wniosek z tego jest taki, że najpierw (nieatomowo) wykonywane jest sumowanie elementów listy, a następnie próba przypisania jej do tupli.

Podsumowując - pytanie jest podchytliwe, oszukańcze i zdradliwe. W zależności od tego jak je zadamy możemy kogoś na rekrutacji ubić lub go poratować ;).


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: