在Lua中有表格的奇怪错误

时间:2019-07-03 08:55:41

标签: 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?

2 个答案:

答案 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