我正在向lua中的表添加字符串。当我在函数中使用表格时,原始表格正在被更改。我只是一个初学者,但我认为该功能无法执行此操作,因为它超出了范围。有什么明显的我想念的吗?
local testTable= {}
testTable.name = {}
testTable.name[1] = "Jon"
print(testTable.name[1])
local function testFunc(a)
a.name[1] = "Bob"
end
local newTable = testTable
testFunc(newTable)
print(testTable.name[1])
我希望输出为:
Jon
Jon
实际输出为:
Jon
Bob
testFunc如何更改testTable?
答案 0 :(得分:0)
您将testTable的地址分配给newTable,因此testTable和newTable指向同一表。 如果要输出为
Jon
Jon
分配newTable时应复制该表。 您可以使用以下功能复制表格:
function table.copy(old)
local new = {}
for k, v in pairs(old) do
new[k] = v
end
return new
end
答案 1 :(得分:0)
当我在函数中使用表格时,原始表格正在被更改。 ...我以为该函数无法执行此操作,因为它超出了范围。
局部变量有自己的作用域,而表则没有。要记住的两件事:
打破现状:
local newTable = testTable
在这一行中,您要将一个变量分配给另一个变量,因此两个变量都引用同一张表。
我们通过分配表中的索引来对表进行突变,因此testFunc
会更改a
(实际上是a.name
)所指的内容。这很方便,因为它允许我们编写函数来对作为参数传递的表进行变异。
以下函数不会像您期望的那样执行任何操作,因为它为裸名a
(恰好是局部变量)分配了一个新表:
local function doNothing(a)
a = {name = {'Bob'}}
end