MST
星途 面试题库

面试题:Python列表与其他序列类型在本质上的差异

Python中有元组、字符串等序列类型,与列表相比,从数据结构、内存分配、可变性等方面深入分析它们本质上的不同之处,并举例说明在哪些场景下应该优先选择列表而非其他序列类型。
44.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

数据结构

  • 列表(List):是一种动态数组,它可以容纳不同类型的元素,元素在内存中是连续存储的,支持随机访问。例如 my_list = [1, 'a', 3.14]
  • 元组(Tuple):是一种不可变的序列,一旦创建就不能修改其内容,同样可容纳不同类型元素,在内存中也是连续存储。比如 my_tuple = (1, 'a', 3.14)
  • 字符串(String):是一种特殊的不可变序列,只能容纳字符类型数据,在内存中同样连续存储。像 my_str = "hello"

内存分配

  • 列表:由于其可动态增长和收缩,在内存分配上更为灵活。当列表元素增加时,可能需要重新分配内存,将原数据复制到新的内存位置。例如不断向列表中 append 新元素时就可能出现这种情况。
  • 元组:创建后大小固定,内存分配相对简单,一旦分配好就不再改变,除非整个元组对象被销毁。
  • 字符串:字符串对象创建后不可变,其内存分配也是固定的。不过Python会对短字符串进行缓存优化,相同内容的短字符串在内存中可能共享同一份数据。

可变性

  • 列表:具有可变性,可以随时添加、删除或修改元素。例如:
my_list = [1, 2, 3]
my_list.append(4)
my_list[1] = 20
  • 元组:不可变,一旦创建,不能对其元素进行修改、添加或删除操作。如下操作会报错:
my_tuple = (1, 2, 3)
# my_tuple[1] = 20  # 报错
  • 字符串:不可变,不能直接修改字符串中的某个字符。如下操作会报错:
my_str = "hello"
# my_str[1] = 'a'  # 报错

优先选择列表的场景

  • 频繁修改数据:例如实现一个简单的购物车功能,需要不断添加、删除商品,这时用列表很合适。
cart = []
cart.append('apple')
cart.remove('apple')
  • 需要动态增长或收缩数据:如在统计用户操作日志时,随着用户操作不断增加日志记录,列表可以方便地动态添加元素。
log = []
log.append('user logged in')
  • 需要对元素进行随机访问和修改:例如在一个游戏中需要频繁更新角色的属性值,角色属性存放在列表中方便直接通过索引访问和修改。
character_stats = [100, 50, 30]  # 生命值、攻击力、防御力
character_stats[0] = 120  # 更新生命值