Lua中如何管理表格?[异常行为示例]

我正在尝试理解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

我不明白为什么两个输出不同。如果top是以引用的方式插入到stack中,则第一个输出结果在我没有用“top = {'x','y','z'}”覆盖top的情况下是有意义的。为什么当我直接输入top的值时,stack没有受到影响?

看起来好像“top = {'x','y','z'}”创建了另一种top实例,以这种方式保留了由stack指向的值。这是对的吗?当您需要深入细节时,Lua文档很缺乏,我找不到任何内容。如果不是明确指定的话,这似乎是一种危险的行为。

问候

_______编辑:_______

我犯了一个错误:“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} -- 它确实改变了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'”,输出将变为:

>> nil nil nil
>> nil nil nil

我已经阅读了“值与类型”部分,但我仍然不完全知道问题所在。 如果我犯了一个愚蠢的错误,请见谅,但我看不到它。

点赞
用户107090
用户107090

Lua 操作的是 _值_,而不是 _变量_。

尝试将

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

替换为

top[2]='y'
2016-12-23 15:25:13
用户734069
用户734069

在 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仍然可以访问它曾经引用的表格。

2016-12-23 17:42:32