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)
,现在 top
和 stack[1]
都引用了 相同的 table。
如果你执行top = {'x'}
,那么你改变了table存储在top
中的内容。你在那个盒子里放了一个新东西。但是stack[1]
仍然指的是设置进去的table。
和这样做没什么区别:
var1 = 5;
var2 = var1;
var1 = 10;
var2
还是五;它没有变成 10。var2
与 var1
没有任何联系。它只是取了var1
当时的值。
您感到困惑的地方在于 table 本身与其 内容.
之间的区别
top
包含对 table 的引用。 top[1]
表示获取top
引用的table的第一个元素。如果你给 top[1]
赋值,你并没有修改变量;您正在修改该变量引用的 table 的 contents。
top[1] = {4, 5, 6}
修改 top
当前引用的 table 中存储的内容。那时,table 是 也被 stack[1]
引用的 。因此,您可以通过 top
或 stack
.
访问 table
一旦您通过 top = {'x'}
更改了 table top
引用,那将不再正确。 top
现在引用了一个不同的 table。但是它曾经引用的 table 仍然可以通过 stack
.
访问
我试图理解一个 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)
,现在 top
和 stack[1]
都引用了 相同的 table。
如果你执行top = {'x'}
,那么你改变了table存储在top
中的内容。你在那个盒子里放了一个新东西。但是stack[1]
仍然指的是设置进去的table。
和这样做没什么区别:
var1 = 5;
var2 = var1;
var1 = 10;
var2
还是五;它没有变成 10。var2
与 var1
没有任何联系。它只是取了var1
当时的值。
您感到困惑的地方在于 table 本身与其 内容.
之间的区别top
包含对 table 的引用。 top[1]
表示获取top
引用的table的第一个元素。如果你给 top[1]
赋值,你并没有修改变量;您正在修改该变量引用的 table 的 contents。
top[1] = {4, 5, 6}
修改 top
当前引用的 table 中存储的内容。那时,table 是 也被 stack[1]
引用的 。因此,您可以通过 top
或 stack
.
一旦您通过 top = {'x'}
更改了 table top
引用,那将不再正确。 top
现在引用了一个不同的 table。但是它曾经引用的 table 仍然可以通过 stack
.