Lua中 pairs和ipairs的区别
Lua系列–pairs和ipairs
Lua中Table的存储方式
在看二者的区别之前,我们首先来看一下Lua中的table是如何在内存中进行分配的。
Table的组成:
1.哈希表 用来存储Key-Value 键值对,当哈希表上有冲突的时候,会通过链表的方式组织冲突元素
2.数组 用来存储 数据(包括数字,表等)
我们来看一个简单的例子。
print('test pairs and ipairs')
local t =
{
[1] = 1,
2,
[3] = 3,
4,
[5] = 5,
[6] = 6
}
print('ipairs ')
for i, v in ipairs(t) do
print(v)
end
print('pairs ')
for i, v in pairs(t) do
print(v)
end
输出结果
test pairs and ipairs
ipairs
2
4
3
pairs
2
4
3
6
5
看到输出结果是不是感觉有点莫名其妙,和平时接触的遍历感觉不太一样。
我们来看一下这中间Table发生了怎样的存储变化
数据在表 t 中的存储方式:
1)根据元素类别分别存进哈希表与数组:
哈希表:{ [1]=1,[3]=3,[5]=5,[6]=6 };
数组:{ 2,4 }
2)将数组中的元素放入哈希表:
当数组中的元素转移到哈希表时,数组中的元素变为[1]=2与[2]=4;而此时哈希表中已有键值对 [1]=1,发生冲突,会将新值2重新与键1匹配,即得到新的键值对[1]=2,此时的哈希表元素为:
{ [1]=2,[2]=4,[3]=3,[5]=5,[6]=6 }
断点调试验证,
以上是纯数字的内容,我们来尝试看一下数字和表混合的内容
local testTab ={1,2,3,4,5};
-- '纯表'
local testTab1 = {a = 1, b = 2, c =3};
-- '杂表1'
local testTab2 = {"zi",a = 5,b = 10, c = 15,"miao","chumo"};
-- '杂表2'
local testTab3 = {"zi",a = 5,b = 10, c = 15,"miao",nil,"chumo"};
输出结果
ipairs testTab
1
2
3
4
5
pairs testTab
1
2
3
4
5
--------------------------
ipairs testTab1
pairs testTab1
1
3
2
--------------------------
ipairs testTab2
zi
miao
chumo
pairs testTab2
zi
miao
chumo
5
15
10
--------------------------
ipairs testTab3
zi
miao
pairs testTab3
zi
miao
chumo
5
15
10
--------------------------
Lua中的table最终在内存中分配都是键值对的形式
还是按照先哈希(键值对),后数组(值)的方式进行分配,
table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,
并不会按照键的字母顺序或是数字顺序存储。
请注意最后一个table,即使元素为空nil的时候,也会分配一个key给它
想测试的可以自己进行一下测试。
pairs和ipairs
二者遍历的区别,
ipairs( i开头的巧记 int类型的数值开头只是为了助记 不是实际含义)
遍历的索引的特点
1.必须是从1开头的 int类型的连续整数 1 2 3 4 5 6 7 8 9 …………………..
2.索引不能断开,断开则终止遍历(当存在nil 类型的数据)
终止时机
1.索引断开
2.下一个索引不存在
pairs
遍历的索引的特点
1.遍历的顺序是随机的,但是一定会遍历整个表
2.pairs是先按照索引值打印(数字型key,可以用[ ]访问),然后打印哈希(键值对)
终止时机
1.所有元素遍历完毕
————————————————
版权声明:本文为CSDN博主「那远远的云端」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wwlcsdn000/article/details/81291756
Lua中 pairs和ipairs的区别的更多相关文章
- lua中pairs和ipairs的区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等.LUA手册中 ...
- Lua 中 pairs 和 ipairs 的区别
ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction ...
- lua中pairs 和 ipairs 的区别
1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...
- lua 中pairs 和 ipairs区别
lua 中pairs 和 ipairs区别 标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (s ...
- Lua 中pairs与ipairs区别
local tmp_tab = {}; tmp_tab[]="lua"; tmp_tab[]="hello" tmp_tab[]="aaa" ...
- lua 中pairs 和 ipairs差别
ipairs 和pairs在lua中都是遍历tbale的函数可是两者有差别 1.pairs遍历table中的全部的key-vale 而ipairs会依据key的数值从1開始加1递增遍历相应的table ...
- Lua-泛型for循环 pairs和ipairs的区别
先看一段简单的代码: local mytable = { , , aa = "abc", subtable = {}, , } --for循环1 print("for - ...
- pairs 和 ipairs 的区别
ipairs 在迭代过程中是会直接跳过所有手动设定key值的变量.pairs不会跳过手动设置key值的变量. 实例 tab = {,,a="cd","d"} f ...
- 【Lua】Lua中ipair和pair的区别
pairs会遍历table的所有键值对. 而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历.顺便说下,记忆也很简单,带i的就是根据int ...
随机推荐
- 4W字的后端面试知识点总结(持续更新)
点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...
- 写给程序员的机器学习入门 (七) - 双向递归模型 (BRNN) - 根据上下文补全单词
这一篇将会介绍什么是双向递归模型和如何使用双向递归模型实现根据上下文补全句子中的单词. 双向递归模型 到这里为止我们看到的例子都是按原有顺序把输入传给递归模型的,例如传递第一天股价会返回根据第一天股价 ...
- 简单的Linq查询语句
下面我来我大家介绍几种简单的查询方式. 1.简单语法 这个LINQ语句的第一个关键字是from,from后面加的是范围变量,范围变量后加in,后加上事先实例化的模型,然后点出数据的来源. List是列 ...
- matplotlib中文显示乱码解决方法
在学习<机器学习实战>这本书的决策树一章时,要用matplotlib画出决策树,然而在显示中文时出现了乱码 import matplotlib.pyplot as plt #定义文本框和箭 ...
- CentOS下安装python3环境及pypy环境
安装前基础环境 1. win7虚拟机CentOS7.6系统 2. 网络环境通过NAT方式 3. 已经配置到yum仓库并系统自带有python2.7 安装前准备 1. python3.6.5源码包:ht ...
- P3879 阅读理解
都这么大了,you这些怎么能算生词呢,难道三年级以前就有人做蓝题了吗(是我不配) 我觉得这道题出难一点点的话,可以整行读入什么的(口嗨怪).先看题目,对于每个生词,输出他出现在了哪些文章(需要排序). ...
- Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...
- RESTful API 规范(一)
一,简介 DRF 即Django rest framework 二,rest 规范 1 协议 API 与用户通信,总是使用https协议 2 域名 1) 应尽量将API 部署在域名下(这种情况会存在跨 ...
- 赞!7000 字学习笔记,一天搞定 MySQL
MySQL数据库简介 MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制也是逐渐成熟,更重要的是开源免费的. MySQL是一种关系数 ...
- 洛谷 P3574 [POI2014]FAR-FarmCraft
题目传送门 题目描述 输入输出格式 输入格式: 输出格式: 一行,包含一个整数,代表题目中所说的最小时间. 输入输出样例 样例输入 样例输出 提示 分析 我们设f[x]为遍历完以x为根的子树且将这棵子 ...