Когда я использую таблицу в функции, исходная таблица изменяется. ... Я думал, что функция не может сделать это, потому что она находится за пределами ее области действия.
Локальные переменные имеют собственную область видимости, а таблицы - нет. Две вещи, которые нужно запомнить:
- Переменные хранят ссылки, а не значения. (Это имеет значение только для изменяемых значений.)
- Таблицы являются изменяемыми, т.е. они могут быть изменены внутри.
Разбивка:
local newTable = testTable
В этой строке вы присваиваете одну переменную другой, поэтому обе переменные ссылаются на одну и ту же таблицу.
Мы изменяем таблицу, присваивая индекс в этой таблице, поэтому testFunc
изменяет все, на что ссылается a
(на самом деле a.name
). Это удобно, потому что позволяет нам писать функции, которые изменяют таблицы, которые мы передаем в качестве аргументов.
Следующая функция ничего не делает, как и следовало ожидать, потому что она присваивает новую таблицу пустому имени a
(которая оказывается локальной переменной):
local function doNothing(a)
a = {name = {'Bob'}}
end