Lua 中一个奇怪的表格错误

我正在向 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?

点赞
用户11043724
用户11043724

你将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
2019-07-03 09:10:37
用户3574628
用户3574628

当我在一个函数中使用表格时,原始表格会发生改变。...我认为函数不能这样做,因为它在它的范围之外。

局部变量有它们自己的作用域,但表格却没有。需要记住的两件事:

  • 变量存储引用,而不是值。(这只对可变值有区别。)
  • 表格是可变的,即它们可以在内部更改。

简单来说:

local newTable = testTable

在这行中,你将一个变量分配给另一个变量,因此两个变量都引用同一个表格。

我们通过为该表格内的索引赋值来改变表格,因此 testFunc 改变了任何 a(实际上是 a.name)所引用的内容。这很方便,因为它允许我们编写函数,以更改我们传递为参数的表格。

以下函数什么也不做,像你预期的那样,因为它将一个新表格分配给裸名 a(这恰好是一个局部变量):

local function doNothing(a)
  a = {name = {'Bob'}}
end
2019-07-03 17:46:13