为了账号安全,请及时绑定邮箱和手机立即绑定

谈谈Python中Tuple和List的异同

标签:
Python

得益于stackoverflow上关于此问题的讨论,得以有机会总结一下tuple和list的用法异同。

一直觉得学习一门新的语言,需要掌握两样东西,一种是技法,一种是心法。技法就是他的定义,语法。但是讲了定义和语法之后,可能你还是很迷惑,特别是遇到像tuple和list这种有相似性的数据类型,你可能仅仅将tuple认为是const list, 是呀,tuple是immutable(不可更改的),list是mutable(可更改的),其余的似乎都差不多,那tuple有什么存在的必要呢?什么情况下我需要用到tuple来存放数据呢?好了,这篇文章我试图和大家来讲一下心法。

在讲心法之前,还是要先从技法讲起,我假设大家都是学习python的新人。以下这个例子是我从stackoverflow搬运过来的,个人觉得这个例子麻雀虽小,五脏俱全,分别从两者的定义,占用的空间大小,可用的操作和用途四个方面来进行比较,但这都是技法层面,虽然在在最后一点的用途上讲到了可以让tuple用来做dictionary的key,但仅仅这样还是不够的。

1. Literal(定义)

someTuple = (1,2)

someList  = [1,2]

2. Size(大小)

a = tuple(range(1000))

b = list(range(1000))

a.__sizeof__()      # 8024

b.__sizeof__()      # 9088

Due to the smaller size of a tuple operation, it becomes a bit faster, butnot that much to mention about until you have a huge number of elements.(由于tuple占用的空间较小,所以基于他上面的操作会更快,但是除非你要处理巨大数量的元素,否则也不用太过计较了)

3. Permitted operations(可允许的操作)

b    = [1,2] 

b[0] = 3       # [3, 2]

a    = (1,2)

a[0] = 3       # Error

That also means that you can't delete an element or sort atuple. However, you could add new element to both list and tuple with the onlydifference that you will change id of the tuple by adding element(tuple是不可更改的数据类型,这也意味着你不能去删除tuple中的元素或者是对tuple进行排序,然而,你既可以往list里去增加一个新的元素,也可以往tuple里去增加一个新的元素,从表面上看,似乎和tuple不能被更改的定义不相符,事实上,是python只是替你重新创建了一个新的tuple而已,可以通过id方法来查看,id方法返回对象在内存中的地址,tuplea和list b在添加完元素之后,tuple a的id已经发生了改变,也即意味着这时的tuplea事实上已经并非原先创建时的那个tuplea了,而针对list b来说,list b在添加新元素前后的id是一样的,b还是那个b,a已经不是那个a了)

a = (1,2)

b = [1,2] 

id(a)          # 140230916716520

id(b)          # 748527696

a += (3,)    # (1, 2, 3)

b += [3]     # [1, 2, 3]

id(a)          # 140230916878160

id(b)          # 748527696

4. Usage(用途)

As a listis mutable, it can't be used as a key in a dictionary, whereas a tuple can beused.(由于list是可改的,所以他是不能作为字典数据类型的键的,而tuple确是可以的)

a = (1,2)

b = [1,2]

c = {a: 1}     # OK

c = {b: 1}     # Error

好了,技法就说到这里了,相信大家对tuple和list的异同已经有了一个全面的认识,但是如何来用,什么时候用哪一个估计还是一头雾水吧,下面试图说一下两者使用上的不同。

首先要给到大家两个概念,heterogeneous和homogeneous。tuple是heterogeneous(异质的),而list是homogeneous(同质)的,是不是有点难理解?好的,我再来展开讲一下:

Tuples通常来讲就是存放一系列“不同类型的东西”的,你需要将一个tuple类型的数据当作一个一致的整体来看待;

List通常来讲就是存放一系列“相同类型的东西”的,对于其中的每一个元素你可能需要单独的来看待和处理。

这里的“类型”并不是狭义的理解为数据类型上的不同,而是更多的是含有语义上不同的概念。可能这样讲还是太抽象,我们来举个例子吧。一个非常好的例子是Python DB API里的fetchmany()方法,他把查询的结果通过list of tuples的方式传了回来,大家可以想象一下,查询数据库返回的多笔记录,每一笔记录他的字段结构都是相同的(也就是他是相同类型的,homogeneous),而对于其中的某条记录里的各字段,他们各自都有自己的语义(也就是他是不同类型的,heterogeneous),所以,其中的每一笔记录,也即每一行数据,就是用tuple来存放的,然后再将这么多笔的tuple用list来一笔笔的装起来,这样是不是就很直观,有概念了。查询所返回的数据格式就是长这个样子的[(),(),(),…()]。讲到这个,我想再多说一句,提一下另外两个概念帮助你加深理解tuple和list,如果你对C语言已经有基本了解的话。Tuple就类似于C里面的结构类型(struct),而list呢,就像C里面的array。

好了,就讲到这里了,是不是有种豁然开朗 加 嘎然而止的感觉,那就再多回头看几遍吧:)



作者:跟着可叔学Python
链接:https://www.jianshu.com/p/28bd34df3889
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消