Lua Academy · Lezione

Copia profonda e copia superficiale

Implementi una copia profonda ricorsiva e comprenda la semantica dei riferimenti.

Lezione 3 di 413 passaggi

Copia profonda e copia superficiale è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Semantica dei riferimenti in Lua

In Lua, assegnare una tabella a un'altra variabile copia il riferimento, non i dati. Entrambe le variabili puntano alla stessa tabella.

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

Copia superficiale

Una copia superficiale crea una nuova tabella con le stesse chiavi e gli stessi valori di primo livello. Le tabelle annidate continuano a essere condivise.

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

Limite della copia superficiale

Modificare una tabella annidata in una copia superficiale influisce sull'originale.

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

Copia profonda tramite ricorsione

Una copia profonda duplica ricorsivamente ogni tabella annidata, interrompendo tutti i riferimenti condivisi.

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

Copia profonda in azione

Dopo una copia profonda, modificare le tabelle annidate nella copia lascia intatto l'originale.

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

Gestione dei cicli

Una copia profonda ingenua non funziona con le tabelle cicliche. Tenga traccia delle tabelle visitate in una tabella memo per gestire i cicli.

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

Copia delle metatabelle

La copia profonda dovrebbe trasferire anche la metatabella con setmetatable(copy, getmetatable(orig)), per preservare il comportamento OOP.

Copia superficiale con table.move

Per gli array sequenziali, table.move consente di creare rapidamente un clone superficiale.

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

Quando usare ciascun tipo

  • Superficiale: tabelle semplici e piatte, clonazione con requisiti critici di prestazioni.
  • Profonda: strutture annidate, serializzazione, snapshot immutabili.

Valori funzione

Le funzioni non vengono mai copiate: sia la copia superficiale sia quella profonda condividono lo stesso riferimento alla funzione. Di solito questo è il comportamento desiderato.

Considerazioni sulle prestazioni

La copia profonda ha complessità O(n) rispetto al numero di nodi. Per alberi molto grandi, valuti invece la condivisione strutturale o gli schemi copy-on-write.

Domanda sul tipo di copia

Dopo una copia superficiale, che cosa succede quando si modifica una tabella annidata nella copia?

Riepilogo: copia profonda e superficiale

La copia superficiale duplica solo le chiavi di primo livello; le tabelle annidate sono condivise. La copia profonda duplica tutto ricorsivamente. Gestisca i cicli con una tabella memo per impedire la ricorsione infinita.

Gratis per iniziare

Impara Lua con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
40
Lezioni
159

Domande Frequenti

La lezione «Copia profonda e copia superficiale» è gratuita?

Sì — il testo completo di «Copia profonda e copia superficiale» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Copia profonda e copia superficiale»?

Implementi una copia profonda ricorsiva e comprenda la semantica dei riferimenti. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Copia profonda e copia superficiale»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. table.sort con comparatori
  2. table.concat e table.move
  3. Copia profonda e copia superficiale
  4. Trasformazione delle tabelle: map, filter, reduce
← Torna a Lua Academy