Grunn og dyp kopiering

I eksempel 1 i artikkelen om lister som inneholder lister har vi ei liste som inneholder tre andre lister:

grader = [[12, 10, 14, 7, 8, 11, 10], [10, 7, 9, 6, 6, 8, 15], [10, 5, 3, 6, 4, 3, 2]]

I Python Tutor ser det slik ut:

Illustrasjon av lister i lister

Så skriver vi

grader_kopi = grader

Som vi ser i artikkelen om å kopiere lister, blir da grader_kopi bare en ny referanse til samme liste:

Illustrasjon av flere referanser til samme liste

Men som vi også ser i i artikkelen om å kopiere lister, hvis vi skriver

grader_kopi = grader[:]

eller

grader_kopi = grader.copy()

blir grader_kopi ei ny liste:

Illustrasjon av grunn kopi av liste

Imidlertid ser vi at de tre listene inni grader ikke er blitt kopiert. grader_kopi er blitt ei ny liste, men den refererer til de samme tre listene som grader. Denne måten å kopiere lister på gir nemlig bare det vi kaller grunn kopiering. Selve lista grader blir kopiert, men ikke listene den refererer til.

Det motsatte av grunn kopiering er dyp kopiering. Da kopieres også listene det refereres til, ikke bare det øverste nivået. For å utføre dyp kopiering kan vi bruke funksjonen deepcopy() fra modulen copy. Hvis vi skriver

from copy import deepcopy

grader_kopi = deepcopy(grader)

ser resultatet slik ut:

Illustrasjon av dyp kopi av liste

Nå har vi også fått kopier av de tre listene inni grader.

Kilder

    • Sweigart A. (2021). Beyond the basic stuff with Python. no starch press