我试图理解一个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部分,但我仍然不完全清楚错误。 对不起,如果我犯了一个愚蠢的错误,但我无法看到它。
答案 0 :(得分:2)
Lua使用值,而不是变量。
尝试替换
top={'x','y','z'}
通过
top[2]='y'
答案 1 :(得分:1)
表是Lua中的值。每个表都是一个独立且不同的值。变量不是值的名称;它们只是容纳它们的盒子。
多个变量可以引用同一个表。因此,在执行top = {}
之后,变量top
具有对表的引用。通过执行table.insert(stack, top)
,现在top
和stack[1]
都引用了相同的表。
如果执行top = {'x'}
,则更改top
中存储的表格。你在那个盒子里放了一个新东西。但是stack[1]
仍然引用了设置在其中的表。
与此相反没有区别:
var1 = 5;
var2 = var1;
var1 = 10;
var2
仍然五;它没有成为10. var2
与var1
无关。它只取了当时var1
的值。
您感到困惑的地方在于表格本身与其内容之间的区别。
top
包含对表的引用。 top[1]
表示获取top
引用的表的第一个元素。如果您为top[1]
分配内容,则不会修改变量;您正在修改该变量引用的表的内容。
top[1] = {4, 5, 6}
修改top
当前引用的表格中存储的内容。那时,该表也是被stack[1]
引用。因此,您可以通过top
或stack
访问该表。
通过执行top
更改表top = {'x'}
引用后,这已不再适用。 top
现在引用了另一个表。但它用于引用的表仍可通过stack
访问。