Tiefe und flache Kopien
Implementieren Sie rekursive tiefe Kopien und verstehen Sie die Semantik von Referenzen
Tiefe und flache Kopien ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Referenzsemantik in Lua
Wenn Sie in Lua eine Tabelle einer anderen Variablen zuweisen, wird die Referenz und nicht die Daten kopiert. Beide Variablen verweisen auf dieselbe Tabelle.
local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1]) -- 99, a is affected!Flache Kopie
Eine flache Kopie erstellt eine neue Tabelle mit denselben Schlüsseln und Werten auf der obersten Ebene. Verschachtelte Tabellen werden weiterhin gemeinsam verwendet.
local function shallowCopy(t)
local copy = {}
for k, v in pairs(t) do copy[k] = v end
return copy
endEinschränkung flacher Kopien
Wenn Sie eine verschachtelte Tabelle in einer flachen Kopie ändern, wirkt sich dies auf das Original aus.
local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1]) -- 99 (shared!)Tiefe Kopie durch Rekursion
Eine tiefe Kopie dupliziert rekursiv jede verschachtelte Tabelle und löst damit alle gemeinsam verwendeten Referenzen auf.
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
endTiefe Kopie in Aktion
Nach einer tiefen Kopie bleibt das Original unverändert, wenn Sie verschachtelte Tabellen in der Kopie ändern.
local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1]) -- 1 (independent!)Zyklen behandeln
Eine naive tiefe Kopie scheitert bei zyklischen Tabellen. Verfolgen Sie besuchte Tabellen in einer Merktabelle, um Zyklen zu behandeln.
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
endMetatabellen kopieren
Eine tiefe Kopie sollte auch die Metatabelle mit setmetatable(copy, getmetatable(orig)) übertragen, damit das OOP-Verhalten erhalten bleibt.
Flache Kopie mit table.move
Für sequenzielle Arrays können Sie mit table.move schnell einen flachen Klon erstellen.
local function arrayCopy(t)
return table.move(t, 1, #t, 1, {})
endWann welche Variante verwenden?
- Flach: einfache flache Tabellen, leistungskritisches Klonen.
- Tief: verschachtelte Strukturen, Serialisierung, unveränderliche Snapshots.
Funktionswerte
Funktionen werden niemals kopiert – sowohl flache als auch tiefe Kopien verwenden dieselbe Funktionsreferenz. Dies ist normalerweise das gewünschte Verhalten.
Leistungsaspekte
Eine tiefe Kopie hat bezogen auf die Anzahl der Knoten die Komplexität O(n). Erwägen Sie bei sehr großen Bäumen stattdessen strukturelles Teilen oder Copy-on-Write-Muster.
Frage zum Kopiertyp
Was geschieht nach einer flachen Kopie, wenn Sie eine verschachtelte Tabelle in der Kopie ändern?
Zusammenfassung: tiefe und flache Kopie
Eine flache Kopie dupliziert nur die Schlüssel der obersten Ebene; verschachtelte Tabellen werden gemeinsam verwendet. Eine tiefe Kopie dupliziert alles rekursiv. Behandeln Sie Zyklen mit einer Merktabelle, um unendliche Rekursion zu verhindern.
Häufig gestellte Fragen
Ist die Lektion „Tiefe und flache Kopien“ kostenlos?
Ja — der vollständige Text von „Tiefe und flache Kopien“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Tiefe und flache Kopien“?
Implementieren Sie rekursive tiefe Kopien und verstehen Sie die Semantik von Referenzen Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Lua Academy zu starten?
Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Tiefe und flache Kopien“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?
Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- table.sort mit Vergleichsfunktionen
- table.concat und table.move
- Tiefe und flache Kopien
- Tabellen transformieren: map, filter, reduce