元组和列表有什么区别

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

相同点

共性说明
可以存放任意元素一般都放同类型
支持索引访问甚至是负数
支持切片操作
逗号分隔元素
都是有序集合(容器)
可以随意嵌套
序列解包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__()  # 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'])
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxianfeng023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值