如何在Lua中管理表格? [引渡行为的例子]

时间:2016-12-23 15:08:05

标签: lua reference insert lua-table

我试图理解一个Lua函数来解析XML格式的字符串,我观察到一个关于如何处理表的意外行为。我将问题总结如下:

local stack = {}
local top = {}
table.insert(stack, top)

table.insert(top,{1,2,3})

top={'x','y','z'}

print(stack[1][1][1],stack[1][1][2],stack[1][1][3])
print(top[1],top[2],top[3])

>> 1 2 3
>> x y z

我不明白为什么两个输出不一样。如果通过引用将顶部插入堆栈,如果我没有用{{1}覆盖顶部,则第一个输出会有意义}。当我直接输入顶部的值时,为什么堆叠不受影响?

看起来top={'x','y','z'} top 创建了另一种实例,其方式是保留 stack 指向的值。这是正确的吗?如果你想详细说明Lua文档是稀缺的,我还没有发现任何相关信息。在我看来,如果没有明确规定,这是一种危险的行为。

此致

_______编辑:_______

我犯了一个错误:top={'x','y','z'}table.insert(top,{1,2,3})不同,它与top={'x','y','z'}相同。

因此,重新制定原始问题,我们有代码:

top[1]={'x','y','z'}

现在,我看到第二个输出完全正常,但我仍然怀疑第一个输出。

如果我将local stack = {} local top = {} table.insert(stack, top) table.insert(top,{1,2,3}) top[1]={4,5,6} -- it does change stack top = {'x'} print(stack[1][1][1],stack[1][1][2],stack[1][1][3]) print(top[1][1],top[1][2],top[1][3]) >> 4 5 6 >> nil nil nil 替换为top = {'x'},则输出转为

top[1] = 'x'

我已阅读Values and Types部分,但我仍然不完全清楚错误。 对不起,如果我犯了一个愚蠢的错误,但我无法看到它。

2 个答案:

答案 0 :(得分:2)

Lua使用,而不是变量

尝试替换

top={'x','y','z'}

通过

top[2]='y'

答案 1 :(得分:1)

表是Lua中的值。每个表都是一个独立且不同的值。变量不是值的名称;它们只是容纳它们的盒子。

多个变量可以引用同一个表。因此,在执行top = {}之后,变量top具有对表的引用。通过执行table.insert(stack, top),现在topstack[1]都引用了相同的表

如果执行top = {'x'},则更改top中存储的表格。你在那个盒子里放了一个新东西。但是stack[1]仍然引用了设置在其中的表。

与此相反没有区别:

var1 = 5;
var2 = var1;
var1 = 10;

var2仍然;它没有成为10. var2var1无关。它只取了当时var1 的值

您感到困惑的地方在于表格本身与其内容之间的区别。

top包含对表的引用。 top[1]表示获取top引用的表的第一个元素。如果您为top[1]分配内容,则不会修改变量;您正在修改该变量引用的表的内容

top[1] = {4, 5, 6}修改top当前引用的表格中存储的内容。那时,该表也是stack[1]引用。因此,您可以通过topstack访问该表。

通过执行top更改表top = {'x'}引用后,这已不再适用。 top现在引用了另一个表。但它用于引用的表仍可通过stack访问。