最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

今日要闻!Python常见面试题009. 元组和列表有什么区别

来源:博客园


(资料图)

009. 元组和列表有什么区别

  • 这个题是简单的,但要拿满分或者说高分不容易

相同点

共性说明
可以存放任意元素一般都放同类型
支持索引访问甚至是负数
支持切片操作
逗号分隔元素
都是有序集合(容器)
可以随意嵌套
序列解包a,b = [1,2]或者 a,b=(1,2)效果是类似的
  • 通用序列操作(有增加篇幅之嫌疑^_-)

    运算结果
    x in s如果 s中的某项等于 x则结果为 True,否则为 False
    x not in s如果 s中的某项等于 x则结果为 False,否则为 True
    s + tst相拼接
    s * nn * s相当于 s与自身进行 n次拼接
    s[i]s的第 i项,起始为 0
    s[i:j]sij的切片
    s[i:j:k]sij步长为 k的切片
    len(s)s的长度
    min(s)s的最小项
    max(s)s的最大项
    s.index(x[, i[, j]])xs中首次出现项的索引号(索引号在 i或其后且在 j之前)
    s.count(x)xs中出现的总次数

不同点

差异列表元组说明
可变性可变mutable不可变immutable
可变性的另外说明动态静态列表长度大小不固定,可以随意地增加、删减或者改变元素;元组长度大小固定,无法增加删减或者改变
一个元素的定义[1](1,)元组必须要加一个逗号,不然是元素自身的类型
符号[]()或者不要t1 = (1,2) 或者 t1 = 1,2 甚至 t1 = 1, 也是元组
元组打包没有打包一说t = 1,2,3
  • 注意决定生成元组的其实是逗号而不是圆括号。 圆括号只是可选的。
  • 推导式
    • 列表推导式, li1 = [ i for i in range(10)] 是列表推导式
    • 但没有元组推导式,t1 = ( i for i in range(10)) 是一个生成器
    • 字典和集合有单独的推导式

其他

以上都是简单的,但下面这些可能你想不到

  1. 列表和元组存储同样的元素,所用的空间并不一样
li1 = [1,2,3]li1.__sizeof__()  # 64t1 = (1,2,3)t1.__sizeof__()  # 48
  • 可以看到元组比列表同等条件下少了16字节

  • 事实上,由于列表是动态的,所以它需要存储指针,来指向对应的元素

  • 由于列表可变,所以需要额外存储已经分配的长度大小,这样 才可以实时追踪列表空间的使用情况,当空间不足时,及时分配额外空间,来看这个例子

    li1 = []li1.__sizeof__()   #  空列表的存储空间为40字节li1.append(1)li1.__sizeof__()  # 72 字节 加入了元素1之后,列表为其分配了可以存储4个元素的空间 每个元素 8字节li1.append(2)li1.append(3)li1.append(4)li1.__sizeof__()  # 72字节,  所以你家了4个元素,仍然是 72li1.append(5)li1.__sizeof__()  # 104 字节 , 再加一个元素,不够了,需要再给你32字节
  • 上面的例子,大概描述了列表空间分配的过程。可以看到,为了减小每次增加/删减操作时 空间分配的开销,Python每次分配空间时都会额外多分配一些,这样的机制叫做over-allocating, 保证了其操作的高效性,增加/删除的时间复杂度均为O(1)

  • 据此,可以得出:元组要比列表更加轻量级一些,元组的性能速度要略优于列表

  1. 列表可以用来实现堆栈,非常容易,最后插入的最先取出(“后进先出”)。把元素添加到堆栈的顶端,使用 append()。从堆栈顶部取出元素,使用 pop(),不用指定索引。

    虽然列表也可以用作队列,最先加入的元素,最先取出(“先进先出”);然而,列表作为队列的效率很低。因为,在列表末尾添加和删除元素非常快,但在列表开头插入或移除元素却很慢(因为所有其他元素都必须移动一位),应该用collections.deque

    >>> from collections import deque>>> queue = deque(["Eric", "John", "Michael"])>>> queue.append("Terry")           # Terry arrives>>> queue.append("Graham")          # Graham arrives>>> queue.popleft()                 # The first to arrive now leaves"Eric">>> queue.popleft()                 # The second to arrive now leaves"John">>> queue                           # Remaining queue in order of arrivaldeque(["Michael", "Terry", "Graham"])

关键词: