首页 > 解决方案 > 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?

标签: lua

解决方案


当我在函数中使用表时,原始表正在改变。...我认为该功能无法做到这一点,因为它超出了它的范围。

局部变量有自己的范围,但表没有。要记住两件事:

  • 变量存储引用,而不是值。(这只会对可变值产生影响。)
  • 表是可变的,即它们可以在内部更改。

分解它:

local newTable = testTable

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

我们通过分配给该表中的索引来改变表,因此testFunc更改a(实际上a.name)引用的任何内容。这很方便,因为它允许我们编写函数来改变我们作为参数传递的表。

正如您所期望的那样,以下函数什么也不做,因为它将一个新表分配给裸名a(它恰好是一个局部变量):

local function doNothing(a)
  a = {name = {'Bob'}}
end

推荐阅读