Tabellen werden geteilt
Bei Zahlen und Texten kopiert = den Wert. Nach local b = a ändert eine Änderung von b nichts an a:
local a = 5
local b = a
b = b + 1
print(a, b)5 6Tabellen verhalten sich anders. Eine Variable enthält nicht die Tabelle selbst, sondern nur eine Referenz darauf: so etwas wie die Adresse der Tabelle im Speicher des Computers. Das ist das 0x… in dem, was print(t) ausgibt. local b = a kopiert die Referenz, nicht die Tabelle, also führen beide Variablen zu derselben Tabelle:
local preise = {Karotten = 5, Kartoffeln = 8}
local josefPreise = preise
josefPreise.Karotten = 6
print(preise.Karotten)
print(preise == josefPreise)6
trueOpa Josef hat „seinen“ Preis geändert, und der von Emma hat sich auch geändert, denn es gibt nur eine Tabelle mit zwei Namen. Und == fragt bei Tabellen, ob es dieselbe Tabelle ist, nicht, ob zwei Tabellen denselben Inhalt haben. Jedes {} erstellt eine neue Tabelle, also:
print({} == {})
print({Karotten = 5} == {Karotten = 5})false
falseUm den Inhalt zweier Tabellen zu vergleichen, vergleiche ihre Schlüssel und Werte selbst, zum Beispiel in einer Schleife.
Dasselbe passiert, wenn du eine Tabelle an eine Funktion übergibst. Der Parameter verweist auf dieselbe Tabelle, die Funktion kann sie also ändern, und die Änderung ist außerhalb sichtbar. Das ist oft genau das, was du willst; so eine Funktion muss nicht einmal etwas zurückgeben:
local function ernten(scheune, pflanze, menge)
scheune[pflanze] = (scheune[pflanze] or 0) + menge
end
local scheune = {}
ernten(scheune, "Karotten", 12)
ernten(scheune, "Karotten", 3)
print(scheune.Karotten)15Willst du eine eigene Tabelle, musst du sie kopieren: Erstelle eine neue Tabelle und kopiere mit pairs jeden Schlüssel und Wert hinein:
local function kopiere(t)
local ergebnis = {}
for schluessel, wert in pairs(t) do
ergebnis[schluessel] = wert
end
return ergebnis
end
local preise = {Karotten = 5, Kartoffeln = 8}
local josefPreise = kopiere(preise)
josefPreise.Karotten = 6
print(preise.Karotten, josefPreise.Karotten)
print(preise == josefPreise)5 6
falseDie Funktion funktioniert auch für Listen, weil pairs auch die Schlüssel 1, 2, 3 … durchgeht. Sie kopiert aber nur eine Ebene: Ist ein Wert selbst eine Tabelle, wie die Scheune in hof.scheune, bekommt die Kopie eine Referenz auf dieselbe innere Tabelle.
So schreibst du es:
Anweisungen
- 1
Führe das Programm aus: Auch Emmas Preise haben sich geändert, weil
hugoPreisedieselbe Tabelle wiepreiseist. Schreibe eine Funktionkopiere(t), die eine neue Tabelle mit denselben Schlüsseln und Werten zurückgibt, und machehugoPreisezu einer Kopie vonpreise. Das Programm gibt dann Folgendes aus:Emma: Karotten 5, Kartoffeln 8, Zucchini 20 Hugo: Karotten 7, Kartoffeln 8, Zucchini 25 - 2
Schreibe am Ende des Programms eine Funktion
erhoehe(t, betrag), die zu jedem Preis in der Tabelle, die sie bekommt,betragaddiert: Sie ändert diese Tabelle und gibt nichts zurück. Erhöhe Hugos Preise um 1 und zeige beide Preislisten noch einmal:Emma: Karotten 5, Kartoffeln 8, Zucchini 20 Hugo: Karotten 8, Kartoffeln 9, Zucchini 26