例一:
local a,b
a = {5}
b = a
a = nil
print(b[1]) ----结果为: 5
关键在于:等号是赋值语句!
a = nil 这句指令是使 变量 a 的指针重新指向 nil; 而不是清空了原来 table 的那块内存。 所以变量 b 的指针仍然指向原来的 table;
也就是说,原来的那个table 的引用计数 从2 减为 1 。
例二:
local a,b
a = {5}
b = a
a = {10}
print(b[1]) ----结果为: 5
道理是一样的, a = {10} 这句指令,是 new 了一个新的 table,把它的地址重新赋给了 a;所以 b 仍然指向原来的 table 没有收到影响;
'' { } '' 是声明一个新的table ,相当于 new。
例三:
换个样子也要认得:
local a,b
a = { data = {value = 5}}
b = a.data
a.data = nil
print( b.value ) ----结果为: 5
---------------------------------------------------------------
local a,b
a = { data = {value = 5}}
b = a.data
a.data = { value = 1000 }
print( b.value ) ----结果为: 5
例四:
如果我真的想让 b 受到影响,随着源数据的清空而清空怎么办???
那就要避免指针的变向,一定要在原地修改table !
local a,b
a = { data = {value = 5}}
b = a
a.data.value = 1000
print(b.data.value) ----结果为 1000
a.data = nil
print( b.data) ----结果为: nil
b 和 a 是指向同一块内存的, a.data 就是 b.data;
这样一来,我等同于是对 b 进行了操作。
00