表格中的新值 - 共享?

问题

在学习 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 -- 这是一个惊喜
{"a", "b"} --[[table: 0x046bde18]]

这似乎是双向的:如果给 b 分配一个新值,那么它也将被分配给 a

另一方面,如果我给 a 分配一个值(例如:a = 1)和 b = a,那么如果 a 的值被改变(a = 2),那么 b 将保留原始值(仍然是 b = 1)。

问题

  1. 为什么这种行为取决于 a 是数组/表还是值?是由于内置元表(__newindex)吗?
  2. 数组/表这种行为的目的是什么?
  3. 如果我想/需要以某种方式分离 ab(或者我想在更改 b 前存储 a 的值),该怎么办?

(我阅读了 Lua 赋值元表和元方法 章节的 Lua 参考手册,但仍不知道为什么会出现这种行为。)

点赞
用户6879826
用户6879826

在你的例子中,ab 只是指向同一个表的引用。在 Lua 中,表是对象,你用第一条语句创建了一个表并将其赋给了 a,然后你用第二个赋值语句创建了一个对同一个表的第二个引用。因此,a[2] = "b"b[2] = "b" 都是作用在同一个底层表(table: 0x046bde18)上的。

表不是一个值,它是一个对象。a = {"a"} 创建了一个表并将其引用赋给了 ab=a 将同一个引用赋给了 b。但是,x=10 将值 10 赋给了 x。如果 y=10 并且你能够改变值 10 的底层值,我想这个改变会反映在 xy 中,但是我不知道有什么明显的方法可以做到这一点。在这段代码中:

x = 10
y = 10
y = y + 1

结果将是 x = 10y = 11。值 10 的底层值没有改变,但是 y 被重新赋值为值 11

如果你想要使用两个可以独立更改的表的副本,你需要编写一个将 a 的成员复制到 b = {} 中的函数。这里有一个讨论如何通过值复制 Lua 表的问题

2017-02-01 16:50:12