Python常见面试题009. 元组和列表有什么区别

Posted 老吴的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 + t st 相拼接
    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__()  # 64

t1 = (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个元素,仍然是 72
    li1.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 arrival
    deque([\'Michael\', \'Terry\', \'Graham\'])
    

以上是关于Python常见面试题009. 元组和列表有什么区别的主要内容,如果未能解决你的问题,请参考以下文章

常见面试题整理--Python概念篇

JVM常见面试题及答案

python常见面试题

c/c++常见面试题

面经Java岗位常见面试题

面试题JVM常见面试题