0Pricing
Lua Academy · Lektion

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
end

Einschrä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
end

Tiefe 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
end

Metatabellen 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, {})
end

Wann 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

  1. table.sort mit Vergleichsfunktionen
  2. table.concat und table.move
  3. Tiefe und flache Kopien
  4. Tabellen transformieren: map, filter, reduce
← Zurück zu Lua Academy