python面试题:详细描述列表与元祖的区别
今天咱们聊一个让Pythoner“爱恨交加”的面试题——列表和元组的区别。
老实说,这个题真是一道Python面试的经典“送命题”,你要是回答得太简单吧,面试官可能觉得你敷衍;答得太深入,又容易把自己绕进坑里。
不过别怕,今天我就用程序员的角度,结合一些实例和段子,帮大家捋清楚列表和元组的区别,让你下一次面试稳如老狗。
1. 列表和元组是什么?简单区别
先上定义,这里别瞪我,虽然无聊,但这个基础要打好:
列表( list):Python中常用的可变序列,用方括号[]定义。元组( tuple):不可变序列,用圆括号`()定义。
举个栗子:
my_list = [1, 2, 3]
my_tuple = (1, 2, 3)
有人可能会说,“这不就是括号的区别嘛!”咳咳,年轻人,你的理解还是停留在表面,来看看它们的几个本质区别。
2. 可变与不可变
这俩最主要的区别就是:
列表是可变的(Mutable)。 元组是不可变的(Immutable)。
什么意思呢?用代码来说明:
# 列表可变
my_list = [1, 2, 3]
my_list[0] = 10 # 改变第一个元素
print(my_list) # [10, 2, 3]# 元组不可变
my_tuple = (1, 2, 3)
try:
my_tuple[0] = 10
except TypeError as e:
print(e) # 'tuple' object does not support item assignment
元组的“不可变性”就像你暗恋的对象发来一句“我们只是朋友”,无论你怎么折腾,关系都改不了。而列表嘛,你稍微努力一下,还能改个模样😅。
3. 性能差异
既然元组是不可变的,那它在性能上就有优势,毕竟不需要处理复杂的可变操作嘛。
元组的访问速度更快。 占用内存更小。
用sys.getsizeof看看它们的大小区别:
import sysmy_list = [1, 2, 3]
my_tuple = (1, 2, 3)
print(sys.getsizeof(my_list)) # 比如:88字节
print(sys.getsizeof(my_tuple)) # 比如:72字节
再比如,如果面试官问你,“为啥性能快?”可以简单回答:元组是静态分配的,内存结构更简单;而列表要支持动态增长,分配和管理的开销更大。
4. 使用场景
元组更适合存储固定的数据,比如经纬度、配置信息等。因为它不可变,安全性更高。比如:
location = (39.9042, 116.4074) # 北京的经纬度
而列表适合存储需要频繁增删改查的数据,比如任务队列、学生名单之类的动态数据。
tasks = ["写代码", "改Bug", "喝咖啡"]
tasks.append("复习面试题")
print(tasks)
想象一下,把经纬度用列表存储,是不是听起来就很危险:“我一个不小心,把北京改成了东京”😂。
5. 方法和操作上的区别
列表有更多灵活操作
列表支持很多可以修改内容的方法,比如append、extend、insert、remove等,而元组则完全没有这些方法。
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # [1, 2, 3, 4]my_tuple = (1, 2, 3)
try:
my_tuple.append(4)
except AttributeError as e:
print(e) # 'tuple' object has no attribute 'append'
元组的操作更局限
元组只能用一些不改变内容的方法,比如count和index:
my_tuple = (1, 2, 3, 3)
print(my_tuple.count(3)) # 2
print(my_tuple.index(3)) # 2
有些人吐槽:“元组这么少功能,有啥用?”别急,元组虽然操作少,但它的用途不在这里,而在“不可变”的特点。
6. 元组的不可变真的是绝对的吗?
面试中,如果你说“元组不可变”,面试官可能会再刨根问底:“那元组内部的对象呢?”
嘿嘿,这里就是面试题的坑点了。元组本身不可变,但如果它包含可变对象(比如列表),这些对象是可以修改的。
my_tuple = ([1, 2, 3], 4, 5)
my_tuple[0].append(99) # 修改列表
print(my_tuple) # ([1, 2, 3, 99], 4, 5)
看到没?元组不动,里面的列表倒是改了个样儿。程序员界有句调侃:“元组是假的不可变!”
7. 用作字典的键
元组有一个强大的特点——它可以作为字典的键,而列表不能。这是因为元组是不可变的,而字典的键要求是不可变的。
# 元组作为字典的键
my_dict = {("name", "age"): "程序员"}
print(my_dict)# 列表作为字典的键
try:
my_dict = {[1, 2, 3]: "程序员"}
except TypeError as e:
print(e) # unhashable type: 'list'
面试官可能会问:“为啥不能用列表当键?” 记住这一点:可变对象会导致哈希值变化,破坏字典的存储结构。
8. 小结:如何回答面试题
面试时,答这个题目时,可以这样有层次地回答:
基本定义:列表是可变的,用方括号定义;元组是不可变的,用圆括号定义。 性能区别:元组更快、更省内存。 应用场景:元组适合固定数据,列表适合动态数据。 方法区别:列表有修改操作,元组没有。 深挖点:元组内部包含的可变对象可以修改;元组可以作为字典的键,列表不行。
如果想更显专业,顺手写几行代码示例,或者甩一句“元组是弱可变的,哈希稳定性更高”,让面试官刮目相看😎。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。