如何删除 Lua 表中的所有元素?

如何删除 Lua 表中的所有元素?我不想这样做:

t = {}
table.insert(t, 1)
t = {}  -- 这会把一个新的指针分配给 t

我想保留相同的指针 t,但删除 t 中的所有元素。

我尝试过:

t = {}
table.insert(t, 1)
for i,v in ipairs(t) do table.remove(t, i) end

上面的方法是否有效?还需要其他操作吗?

原文链接 https://stackoverflow.com/questions/4880368

点赞
stackoverflow用户513763
stackoverflow用户513763

最简单和表现最好的方法如下:

for k,v in pairs(tab) do tab[k]=nil end

你提供的方法是不可用的:table.remove会将剩余的元素移动以填补空洞,进而打乱了表的遍历。详情请参阅 next 函数的说明

2011-02-02 22:27:13
stackoverflow用户598655
stackoverflow用户598655
对于表 t 中的每个键值对,
执行以下操作:
    将键对应的值设为 nil。

如果表不完全作为数组使用,则使用 ipairs 可能会有困难。
2011-02-02 22:31:37
stackoverflow用户1183387
stackoverflow用户1183387

为了使用忽略元方法 __pairs 的更快版本:

local next = next
local k = next(tab)
while k ~= nil do
  tab[k] = nil
  k = next(tab, k)
end

编辑:正如评论中 @siffiejoe 提到的,这可以通过将 pairs 调用替换为其默认返回值完成简化: 使用 next 方法和表本身。另外,为了避免所有元方法,可以使用 rawset 方法进行表索引赋值:

for k in next, tab do rawset(tab, k, nil) end
2014-12-04 06:34:26
stackoverflow用户4988149
stackoverflow用户4988149

#table 表示表的大小,因此如果 t = {1,2,3},则 #t = 3

你可以使用以下代码删除元素:

while #t ~= 0 do rawset(t, #t, nil) end

这将遍历表并删除每个元素,最终得到一个空表。

2015-06-10 02:34:52
stackoverflow用户4988149
stackoverflow用户4988149

表元素的插入和删除比较

表大小为10000000

[1] while和rawset

while #t ~= 0 do rawset(t, #t, nil) end

花费时间= 0.677220

[2] next和rawset

for k in next, t do rawset(t, k, nil) end

花费时间= 0.344533

[3] ipairs和rawset

for i, v in ipairs(t) do t[i] = nil end

花费时间= 0.012450

[4] for、rawset

count = #t
for i=0, count do t[i]=nil end

花费时间= 0.009308

表元素的插入

[1] table.insert函数

for i=0, 10000000 do    table.insert(t, i, i) end

花费时间= 1.0590489

[2] 使用#t

for i=0, 10000000 do    t[#t+1] = i end

花费时间= 0.703731

[3] for、rawset

for i=0, 10000000 do rawset(t, i, i) end

花费时间= 0.100010

结果。

最快的删除方法:4

最快的插入方法:3

2015-06-13 06:12:58
stackoverflow用户7224093
stackoverflow用户7224093

将变量改为其他任何值然后再改回表格,这样它就为空。

t = {1,2,3}
print(t[1])      -- 1
t = "Hello World"
print(t)          -- Hello World
t = {}
print(t[1])       -- nil
2022-05-12 07:38:38