表中的新值 - 共享?

时间:2017-02-01 16:44:33

标签: lua

问题

在尝试学习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)。

问题

  1. 为什么这种行为会有所不同,具体取决于天气a是数组/表还是值?是由于内置的​​元表(__newindex)?
  2. 数组/表的这种行为的目的是什么?
  3. 如果我想/需要以某种方式单独ab(或者如果我想在更改a之前存储b的值,该怎么办?)该怎么办?
  4. (我阅读了Lua参考手册中的Lua AssignmentMetatables and Metamethods章节,但仍然不知道为什么会出现这种行为。)

1 个答案:

答案 0 :(得分:2)

在您的示例中,ab只是对同一个表的引用。在Lua中,表是对象,您创建了一个表并使用第一个语句将其分配给a,然后使用第二个赋值创建了对同一个表的第二个引用。因此,a[2] = "b"b[2] = "b"都作用于同一个基础表(表:0x046bde18)。

表不是值,它是一个对象。 a = {"a"}构造一个表,并将对表的引用分配给ab = ab分配相同的引用。但是,x = 10会将值10分配给x。如果y = 10并且您可以更改10的基础值,我认为此更改将反映在xy中,但我知道没有明显的方法可以做这个。在这段代码中:

x = 10
y = 10
y = y + 1

结果值为x = 10y = 1110的基础值未发生变化,但y已重新分配给值11

如果您想使用可以独立更改的表的两个副本,则需要编写一个将a的成员复制到b = {}的函数。 Here is a question that discusses making copies of tables