In Python zijn lijsten (list) veranderlijke structuren, terwijl tuples (tuple) onveranderlijk zijn.
Voorbeeld, ter illustratie van wijziging in list en tuple:
lst = [1, 2, 3] lst.append(4) # OK lst[1] = 20 # OK tup = (1, 2, 3) tup[1] = 20 # TypeError
Prestaties:
Vraag: Waarom worden de bewerkingen voor het toevoegen van elementen aan een lijst meestal snel uitgevoerd (O(1)), als dit vanuit het standpunt van de array zou moeten leiden tot geheugenherverdeling?
Antwoord:
Python implementeert dynamische arrays met "extra geheugenallocatie" voor meerdere elementen tegelijkertijd. Daarom duurt append meestal O(1), en vindt geheugenherverdeling alleen plaats bij echt uitputten van het gereserveerde blok.
Voorbeeld:
import sys lst = [] for i in range(10): lst.append(i) print(len(lst), sys.getsizeof(lst)) # Geheugengrootte groeit niet strikt lineair
Geschiedenis
In een project werden list gebruikt als sleutels van een woordenboek. De ontwikkelaar wist niet dat lijsten niet gehasht kunnen worden (mutability), wat resulteerde in de fout "TypeError: unhashable type: 'list'".
De ontwikkelaar maakte vaak lange lijsten door ze via + te concatenaten. Dit leidde tot extra kopieën van de array en hoge overhead qua geheugen en tijd. Het was efficiënter geweest om append in een lus of generators te gebruiken.
In het loggingsysteem werden tuples gekozen voor het opslaan van tijdstempels, denkend dat het door de onveranderlijkheid sneller zou zijn. Maar er ontstond periodiek de behoefte aan wijziging, wat vroeg om constant nieuwe tuples te maken (copy-on-write) en leidde tot vertraging in vergelijking met het gebruik van lijsten.