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

python,常见,面试题,元组,列表,什么,区别 · 浏览次数 : 82

小编点评

元组和列表的不同点如下: 1. **长度固定:** 元组长度固定,无法增加或删除一个元素。 2. **可变性:** 元组可以变动,但需要在创建元组之前进行加号运算。 3. **存储方式:** 元组使用逗号进行分隔,列表使用列表元素的类型符号和索引进行存储。 4. **可变性:** 列表可以变动,但需要在创建列表时进行加号运算。 5. **插入元素:** 元组可以插入元素,但必须在创建元组之前进行加号运算。 6. **删除元素:** 元组可以删除元素,但必须在创建元组之前进行删除操作。 7. **索引:** 元组的索引从创建元组的第一个元素开始,并按元素的顺序递增。 8. **效率:** 元组比列表更轻量级,性能速度略优于列表。 9. **可用于堆栈:** 元组可以用于实现堆栈,非常容易。

正文

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常见面试题009. 元组和列表有什么区别

009. 元组和列表有什么区别 这个题是简单的,但要拿满分或者说高分不容易 相同点 | 共性 | 说明 | | | | | 可以存放任意元素 | 一般都放同类型 | | 支持索引访问 | 甚至是负数 | | 支持切片操作 | | | 逗号分隔元素 | | | 都是有序集合(容器) | | | 可以随

Python常见面试题001-005,涉及深浅拷贝、MRO、函数可变参数、作用域、is和==的区别等

Python常见面试题001-005 参考资料 https://github.com/taizilongxu/interview_python https://github.com/hantmac/Python-Interview-Customs-Collection https://github.

Python常见面试题006 类方法、类实例方法、静态方法有何区别?

006. Python中类方法、类实例方法、静态方法有何区别? 全部放一个里面篇幅过大了,就拆分成1个个发布 示例代码 class Human: def __init__(self, name): self.name = name def say(self): print(f'我的名字是{self.

Python常见面试题007. 谈谈Python中__init__和__new__的区别

007. 谈谈Python中__init__和__new__的区别 python中关于dunder method双下方法,或magic method魔术方法的描述多在 https://docs.python.org/zh-cn/3.9/reference/datamodel.html#special

Python常见面试题008. 谈谈python中的解包

008. 谈谈python中的解包 这是个简单的知识点,但有的学员并不理解 unpacking解包 解,对应的是*或者**,也有自动解包之说 包对应的可迭代对象 自动解包 赋值的demo a,b = [1,2] print(a) # 1 print(b) # 2 将容器里面的元素逐个取出来分别赋值

Python常见面试题011. 如何在Python中动态创建类?

011. 如何在Python中动态创建类? 说在前面 答案是type 你印象中的type是用来查看对象的类型的 li = [] type(li) # 得到list 对自定义的类是这样的 class Person: pass wuxianfeng = Person() type(wuxianfeng)

Python常见面试题010. Python的int占多大内存?

010. Python的int占多大内存? 示例代码 import sys a = 0 print(a.__sizeof__()) # 24 print(sys.getsizeof(a)) # 24 所以答案是24?并不是!看下面 import sys b = 1 print(b.__sizeof_

Python常见面试题012. 可迭代对象和迭代器有啥区别?

012. 可迭代对象和迭代器有啥区别? 2者不是一回事(废话) 比如 from collections.abc import Iterable,Iterator print(isinstance([1, 2], Iterable)) # True 列表是可迭代对象 print(isinstance(

Python常见面试题013.请说出下面的代码返回结果是什么?

013.请说出下面的代码返回结果是什么? *的坑;简单题 参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq 示例代码 lists = [[]] * 3 lists[0].append(1) 请问lists此时是什么

Python常见面试题014.请说出下面的代码返回结果是什么?

示例代码 def fun(a, b, c, d): nums = [] for num in range(a, b): nums.append(lambda: num ** c) return nums[d]() print(fun(1, 5, 2, 0)) print(fun(1, 5, 2, 1