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]
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:
list.append()– voegt één item toe aan het einde.list.extend()– voegt elk item uit een iterabele toe.list.insert()– voegt in op een gegeven positie.list.remove()– verwijdert het eerste voorkomen van een waarde.list.pop()– verwijdert een item en retourneert het (standaard het laatste).list.clear()– verwijdert elk item.list.sort()– sorteert ter plekke. Geefreverse=Truemee voor aflopende volgorde.list.reverse()– keert de volgorde ter plekke om.
>>> 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.intest 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.
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.