2.7. Lists

Een list is een veranderlijke, geordende reeks waarden. Anders dan strings en bytes kunnen lijsten waarden van elk type bevatten, en kun je items ter plekke wijzigen, toevoegen of verwijderen.

2.7.1. Lijsten maken

Vierkante haken maken een lijstliteral:

empty   = []
nums    = [1, 2, 3]
mixed   = [1, "two", 3.0, True, None]    # any types
nested  = [[1, 2], [3, 4], [5, 6]]       # lists of lists

De list-constructor bouwt een lijst uit elke iterabele:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. Lengte, indexeren en slicen

len() retourneert het aantal items. Indexeren en slicen werken op dezelfde manier als bij strings – posities beginnen bij 0, negatieve indices tellen vanaf het einde, en een slice buiten het geldige bereik wordt stilzwijgend afgekapt in plaats van een fout te veroorzaken:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Een lijst van zes cellen, met positieve indices 0..5 erboven en negatieve indices -6..-1 onder elke cel.

Positieve indices tellen vanaf de voorkant; negatieve indices tellen vanaf het einde.

De slice-syntaxis is een verkorte schrijfwijze voor een slice-object dat Python achter de schermen aanmaakt. nums[1:4] is hetzelfde als nums[slice(1, 4)]. Je maakt er zelden zelf een, maar slice() is af en toe handig om een slice als waarde op te slaan voor hergebruik:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. Een lijst muteren

Lijsten ondersteunen ter plekke toewijzing via index en slice:

>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400]    # slice can change the length
>>> nums
[99, 200, 300, 400]

De meest gebruikte lijstmethoden:

>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]

Deze methoden wijzigen de lijst ter plekke en retourneren None. Schrijven van

nums = nums.sort()    # nums is now None -- common bug

is bijna nooit wat je wilt; de oorspronkelijke nums is wel gesorteerd, maar de toewijzing overschrijft de naam vervolgens met de retourwaarde. Roep nums.sort() op een eigen regel aan, of gebruik de ingebouwde sorted() om een nieuwe gesorteerde lijst terug te krijgen zonder de oorspronkelijke te muteren.

2.7.4. Operatoren

  • + voegt twee lijsten samen tot een nieuwe lijst.

  • * herhaalt een lijst.

  • in test op lidmaatschap.

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. Over een lijst itereren

Een for-lus doorloopt de items in volgorde:

for n in [10, 20, 30]:
    print(n)

2.7.6. Aliasing en mutatie

Een lijst is één enkele waarde in het geheugen; meerdere namen kunnen naar dezelfde lijst verwijzen. Een mutatie via één naam is zichtbaar via elke andere naam die naar dezelfde lijst verwijst.

Twee variabelen a en b die beide naar hetzelfde lijstobject verwijzen; toevoegen aan a is zichtbaar via b.

a en b verwijzen beide naar dezelfde lijst. Een mutatie via een van beide namen verandert wat elke andere naam ziet.

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

Om een onafhankelijke kopie te maken, slice je de hele lijst of roep je de list-constructor aan:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

Dit kopieert alleen de bovenste laag van de lijst; geneste lijsten worden nog steeds gedeeld tussen het origineel en de kopie.