问题
在尝试学习lua
时,我意外地发现了如果
a = {"a"}
b = a
比这产生(毫不奇怪):
a
{"a"} --[[table: 0x046bde18]]
b
{"a"} --[[table: 0x046bde18]]
但是如果:
a[2] = "b"
为什么a == b
仍为true
?
a
{"a", "b"} --[[table: 0x046bde18]]
b -- this is a surprise
{"a", "b"} --[[table: 0x046bde18]]
这似乎有两种方式:如果为b
分配了新值,那么它也会分配给a
。
另一方面,如果我指定a
一个值(例如:a = 1
)和b = a
,那么如果a
值已更改(a = 2
),那么b
保留原始值(仍为b = 1
)。
问题
a
是数组/表还是值?是由于内置的元表(__newindex
)?a
和b
(或者如果我想在更改a
之前存储b
的值,该怎么办?)该怎么办? (我阅读了Lua参考手册中的Lua Assignment和Metatables and Metamethods章节,但仍然不知道为什么会出现这种行为。)
答案 0 :(得分:2)
在您的示例中,a
和b
只是对同一个表的引用。在Lua中,表是对象,您创建了一个表并使用第一个语句将其分配给a
,然后使用第二个赋值创建了对同一个表的第二个引用。因此,a[2] = "b"
和b[2] = "b"
都作用于同一个基础表(表:0x046bde18)。
表不是值,它是一个对象。 a = {"a"}
构造一个表,并将对表的引用分配给a
。 b = a
为b
分配相同的引用。但是,x = 10
会将值10
分配给x
。如果y = 10
并且您可以更改10
的基础值,我认为此更改将反映在x
和y
中,但我知道没有明显的方法可以做这个。在这段代码中:
x = 10
y = 10
y = y + 1
结果值为x = 10
和y = 11
。 10
的基础值未发生变化,但y
已重新分配给值11
。
如果您想使用可以独立更改的表的两个副本,则需要编写一个将a
的成员复制到b = {}
的函数。 Here is a question that discusses making copies of tables