Lua Academy · leksjon

Dyp og grunn kopiering

Implementer dyp, rekursiv kopiering og forstå referansesemantikk.

Leksjon 3 av 413 trinn

Dyp og grunn kopiering er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Referansesemantikk i Lua

I Lua kopierer det å tilordne en tabell til en annen variabel referansen, ikke dataene. Begge variablene peker på den samme tabellen.

local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1])  -- 99, a is affected!

Grunn kopi

En grunn kopi oppretter en ny tabell med de samme nøklene og verdiene på øverste nivå. Nestede tabeller deles fortsatt.

local function shallowCopy(t)
  local copy = {}
  for k, v in pairs(t) do copy[k] = v end
  return copy
end

Begrensning ved grunn kopi

Hvis du endrer en nestet tabell i en grunn kopi, påvirker det originalen.

local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1])  -- 99 (shared!)

Dyp kopi via rekursjon

En dyp kopi dupliserer hver nestede tabell rekursivt og bryter alle delte referanser.

local function deepCopy(orig)
  local copy
  if type(orig) == "table" then
    copy = {}
    for k, v in pairs(orig) do
      copy[deepCopy(k)] = deepCopy(v)
    end
    setmetatable(copy, getmetatable(orig))
  else
    copy = orig
  end
  return copy
end

Dyp kopi i praksis

Etter en dyp kopi påvirker endringer i nestede tabeller i kopien ikke originalen.

local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1])  -- 1 (independent!)

Håndtere sykler

En naiv dyp kopi mislykkes for tabeller med sykliske referanser. Spor besøkte tabeller i en memo-tabell for å håndtere sykler.

local function deepCopyMemo(orig, memo)
  memo = memo or {}
  if type(orig) ~= "table" then return orig end
  if memo[orig] then return memo[orig] end
  local copy = {}
  memo[orig] = copy
  for k, v in pairs(orig) do
    copy[deepCopyMemo(k, memo)] = deepCopyMemo(v, memo)
  end
  setmetatable(copy, getmetatable(orig))
  return copy
end

Kopiere metatabeller

En dyp kopi bør også overføre metatabellen med setmetatable(copy, getmetatable(orig)) for å bevare OOP-atferden.

Grunn kopi med table.move

For sekvensielle rekker kan du bruke table.move til å lage en rask grunn klone.

local function arrayCopy(t)
  return table.move(t, 1, #t, 1, {})
end

Når du bør bruke de ulike typene

  • Grunn: enkle flate tabeller og kloning der ytelsen er kritisk.
  • Dyp: nestede strukturer, serialisering og uforanderlige øyeblikksbilder.

Funksjonsverdier

Funksjoner kopieres aldri – både grunn og dyp kopi deler den samme funksjonsreferansen. Dette er vanligvis ønsket atferd.

Ytelseshensyn

Dyp kopi har kompleksiteten O(n), der n er antallet noder. For svært store trær bør du heller vurdere strukturell deling eller copy-on-write-mønstre.

Spørsmål om kopitype

Hva skjer når du endrer en nestet tabell i kopien etter en grunn kopi?

Oppsummering: dyp kontra grunn kopi

Grunn kopi dupliserer bare nøkler på øverste nivå; nestede tabeller deles. Dyp kopi dupliserer alt rekursivt. Håndter sykler med en memo-tabell for å hindre uendelig rekursjon.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Dyp og grunn kopiering» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Dyp og grunn kopiering», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Dyp og grunn kopiering»?

Implementer dyp, rekursiv kopiering og forstå referansesemantikk. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Dyp og grunn kopiering»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. table.sort med sammenligningsfunksjoner
  2. table.concat og table.move
  3. Dyp og grunn kopiering
  4. Transformere tabeller: map, filter, reduce
← Tilbake til Lua Academy