伙计们。有人可以帮我吗?
输入
a = {}
a.c = {1,2,3}
print(#a)
print(a.c)
输出
0
table: 0x11ed7a0
为什么#a为0?为什么不是1?
谢谢。
答案 0 :(得分:3)
它为零,因为您的表a
不是序列。
序列是一个使用1..n键的表,其中n是序列的大小。
换句话说,#
用于序列长度,而不是表长度。
只有一个边界的表称为序列。例如,表格 {10,20,30,40,50}是一个序列,因为它只有一个边界(5)。桌子 {10,20,30,nil,50}有两个边界(3和5),因此不是 顺序。表格{nil,20,30,nil,nil,60,nil}具有三个边框(0、3, 和6),所以它也不是序列。表{}是边界为0的序列。 请注意,非自然键不会干扰表是否为序列。
当t是一个序列时,#t返回其唯一的边界,该边界与 序列长度的直观概念。当t不是序列时,#t 可以返回其任何边界。 (确切的内容取决于 表的内部表示,而表的内部表示又取决于表的方式 并填充了其非数字键的内存地址。)
答案 1 :(得分:1)
Lua表的构造与其他语言的构造不同。正如Lua manual所示:
表是Lua中主要的(实际上是唯一的)数据结构化机制,也是功能强大的一种。我们使用表以简单,统一和有效的方式表示普通数组,符号表,集合,记录,队列和其他数据结构。
此外,表具有足够的动态性,可以一次以多种方式使用它。例如,一个表可以同时用作数组和映射。这在内部产生了一些不幸的后果。在内部,每个Lua表都有两个部分:数组和哈希映射。
length运算符仅对表的数组部分进行操作;不使用额外的内存来存储表中包括哈希映射部分的项目总数。如果需要该功能,则必须手动实现。这样做的几种好方法是使用getter和setter,手动更新本地计数器或使用具有索引和newindex元方法的代理表。
作为一个有趣的补充说明,有时可能很难判断某个值是否存储在表的数组或哈希部分中。考虑一下Lua 5.3中的这些示例:
1: t = {true, nil, true} -- #t = 3
2: t = {true, [2] = true} -- #t = 2
3: t = {true, [3] = true} -- #t = 1
4: t = {true, true, true} t[2] = nil -- #t = 3