谈谈Python中Tuple和List的异同

得益于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


本公众号坚持原创,坚持简单粗鄙的排版(把更多的精力放花在视频内容的制作上),欢迎转载,并请注明出处,请勿作任何商业用途。

谢谢大家的持续关注。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容