浅拷贝是对基础类型的值进行复制,对表复杂类型直接引用(和被拷贝的对象指向同一一个内存地址)。
浅拷贝通过赋值操作符“=”来实现,或者通过代码实现:
对表内的number类型和table类型数据浅拷贝
function copy(o)
if type(o)=="table" then
local nt={}
for i, v in pairs(o) do
nt[i]=v
end
nt=o
return nt
else
return o
end
end
测试:
function copy(o)
if type(o)=="table" then
local nt={}
print(string.format("赋值前拷贝的表nt:%s",nt))
for i, v in pairs(o) do
nt[i]=v
print(string.format("赋值中v:%s",v))
end
nt=o --让需要拷贝的表和被拷贝的表是同一内存地址
print(string.format("赋值后拷贝的表nt:%s",nt))
return nt
else
return o
end
end
a={
x=100,
tb={y=10}
}
print(string.format("赋值前被拷贝的表:%s",a))
b=copy(a)
b.x=1
print("被拷贝表的值:"..a.x.." 拷贝的表的值:"..b.x)
结果:
在迭代器遍历后,需要使两个表的内存地址相同(代码中的nt=o)。不相同则只有表内的子表内存地址相同。
测试:
function copy(o)
if type(o)=="table" then
local nt={}
print(string.format("赋值前拷贝的表nt:%s",nt))
for i, v in pairs(o) do
nt[i]=v
print(string.format("赋值中v:%s",v))
end
--nt=o --让需要拷贝的表和被拷贝的表是同一内存地址
print(string.format("赋值后拷贝的表nt:%s",nt))
return nt
else
return o
end
end
a={
x=100,
tb={y=10}
}
print(string.format("赋值前被拷贝的表:%s",a))
b=copy(a)
b.x=1
b.tb.y=-5
print("被拷贝表内x的值:"..a.x.." 拷贝的表内x的值:"..b.x)
print("被拷贝表内子表的y值:"..a.tb.y.." 拷贝的表内子表的y值:"..b.tb.y)
结果:
总结
通过代码实现浅拷贝时。需要注意使拷贝的表与被拷贝的表指向同一内存地址,如果不是同一地址,不影响子表的浅拷贝(子表仍然是同一内存地址)。
笔者认为这个代码不够理想,认为代码里的“=”都应该替换成copy函数,可惜能力有限,于是借此抛转引玉,欢迎指教