得益于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, but not 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 a tuple. However, you could add new element to both list and tuple with the only difference that you will change id of the tuple by adding element(tuple是不可更改的数据类型,这也意味着你不能去删除tuple中的元素或者是对tuple进行排序,然而,你既可以往list里去增加一个新的元素,也可以往tuple里去增加一个新的元素,从表面上看,似乎和tuple不能被更改的定义不相符,事实上,python只是替你重新创建了一个新的tuple而已,可以通过id方法来查看,id方法返回对象在内存中的地址,tuple a和list b在添加完元素之后,tuple a的id已经发生了改变,也即意味着这时的tuple a事实上已经并非原先创建时的那个tuple a了,而针对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 list is 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。
好了,就讲到这里了,是不是有种豁然开朗 加 嘎然而止的感觉,那就再多回头看几遍吧:),觉得好的话,请给我在下方点一下喜欢的小心心♥,谢谢。
参考链接:https://stackoverflow.com/questions/626759/whats-the-difference-between-lists-and-tuples
http://news.e-scribe.com/397
本公众号坚持原创,坚持简单粗鄙的排版(把更多的精力放花在视频内容的制作上),欢迎转载,并请注明出处,请勿作任何商业用途。
谢谢大家的持续关注。