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

How are tables managed in Lua? [Example of extrange behaviour]

我试图理解一个 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[=50 则第一个输出是有意义的=] 与 top={'x','y','z'}。为什么直接输入top的值,stack不受影响?

看起来好像 top={'x','y','z'}top 创建了另一种实例,这样 stack[=50] 指向的值=] 被保留。这是正确的吗? Lua 当您想详细了解时,文档很少,我还没有找到任何相关信息。在我看来,如果没有明确指定,这是一种危险的行为。

此致

_______Edit:_______

我犯了一个错误: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',则输出变为

>> nil nil nil
>> nil nil nil

我已经阅读了 Values and Types 部分,但我仍然不完全知道哪里出了问题。 对不起,如果我犯了一个愚蠢的错误,但我看不到它。

Lua 对 进行运算,而不是对 变量.

进行运算

尝试替换

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

来自

top[2]='y'

表格是 Lua 中的值。每个 table 都是一个独立且不同的值。变量不是值的名称;它们只是暂时存放它们的盒子。

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

如果你执行top = {'x'},那么你改变了table存储在top中的内容。你在那个盒子里放了一个新东西。但是stack[1]仍然指的是设置进去的table。

和这样做没什么区别:

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

var2还是;它没有变成 10。var2var1 没有任何联系。它只是取了var1当时的值

您感到困惑的地方在于 table 本身与其 内容.

之间的区别

top 包含对 table 的引用。 top[1]表示获取top引用的table的第一个元素。如果你给 top[1] 赋值,你并没有修改变量;您正在修改该变量引用的 table 的 contents

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

访问 table

一旦您通过 top = {'x'} 更改了 table top 引用,那将不再正确。 top 现在引用了一个不同的 table。但是它曾经引用的 table 仍然可以通过 stack.

访问