Kategorie: luaSchwierigkeit: FortgeschrittenVeröffentlicht:
Table Referenzen vs. Wertkopien in Lua
Das Problem
Einer der häufigsten Fehlerquellen in Lua tritt auf, wenn Entwickler erwarten, dass Tabellen als Wertkopien übergeben werden, während sie tatsächlich als Referenzen übergeben werden. Dies kann zu unerwarteten Datenänderungen führen.
-- Fehlerbeispiel local function modifyTable(t) t.value = 42 end local originalTable = {value = 10} local vermeintlicheKopie = originalTable -- Erstellt eine Referenz, keine Kopie! modifyTable(vermeintlicheKopie) print(originalTable.value) -- Ausgabe: 42 (nicht 10, wie vielleicht erwartet)
Warum das passiert
In Lua sind Tabellen Referenztypen. Wenn du eine Tabelle einer neuen Variable zuweist oder als Argument übergibst, erstellst du eine neue Referenz auf dieselbe Tabelle, nicht eine Kopie ihres Inhalts.
Die Lösung
Um eine echte Kopie einer Tabelle zu erstellen, musst du ihren Inhalt explizit kopieren:
-- Lösung 1: Flache Kopie local function flacheKopie(t) local kopie = {} for k, v in pairs(t) do kopie[k] = v end return kopie end local originalTable = {value = 10} local echteKopie = flacheKopie(originalTable) modifyTable(echteKopie) print(originalTable.value) -- Ausgabe: 10 (Original bleibt unverändert) print(echteKopie.value) -- Ausgabe: 42 (nur die Kopie wird geändert)
Für verschachtelte Tabellen brauchst du eine tiefe Kopie:
-- Lösung 2: Tiefe Kopie local function tiefeKopie(t) if type(t) ~= 'table' then return t end local kopie = {} for k, v in pairs(t) do kopie[k] = type(v) == 'table' and tiefeKopie(v) or v end return kopie end
Best Practices
- Sei immer explizit, ob du eine Referenz oder eine Kopie brauchst
- Nutze flache Kopien für einfache Tabellen
- Nutze tiefe Kopien für verschachtelte Strukturen
- Dokumentiere Funktionen, die ihre Tabellenargumente modifizieren
- Erwäge unveränderliche (immutable) Muster für komplexe Datenstrukturen
Häufige Fallstricke
- Vergessen, dass Funktionsargumente Referenzen sind
- Verschachtelte Tabellen beim Kopieren nicht berücksichtigen
- Annehmen, dass Zuweisungen Kopien erstellen
- Gemeinsam genutzte Tabellenreferenzen an mehreren Stellen modifizieren
Verwandte Konzepte
- Table Metatables
- Garbage Collection
- Speicherverwaltung
- Funktionsparameterübergabe