news 2026/2/24 2:22:34

Day 97:【99天精通Python】常见面试题解析 (上) - 语言基础与数据结构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 97:【99天精通Python】常见面试题解析 (上) - 语言基础与数据结构

Day 97:【99天精通Python】常见面试题解析 (上) - 语言基础与数据结构

前言

欢迎来到第97天!

我们的99天之旅即将到达终点。你已经掌握了大量的 Python 技能,但要将这些技能转化为一份满意的工作,还需要通过技术面试这一关。

面试官不仅想知道你"会用什么",更想知道你"懂不懂原理"。
从今天开始,我们将用 3 天时间,梳理 Python 面试中最高频的考点,助你做好最后的冲刺。

本节内容:

  • Python 语言特性 (GIL, is vs ==, 拷贝)
  • 数据结构 (List, Dict, Tuple)
  • 列表/字典推导式
  • 如何回答面试题

一、Python 语言特性

1. 问:谈谈你对 Python GIL (全局解释器锁) 的理解。

回答思路: 是什么 -> 为什么有 -> 有什么影响 -> 怎么解决

参考回答:

  1. 是什么 (What): GIL 全称 Global Interpreter Lock,是 CPython 解释器中的一个互斥锁。它保证了在同一时刻,只有一个线程能执行 Python 的字节码
  2. 为什么有 (Why): 主要是为了简化 CPython 的内存管理。因为有了 GIL,就不需要考虑多线程下对 Python 对象进行读写的线程安全问题,所有对象访问默认就是安全的。
  3. 有什么影响 (Impact):
    • 正面: 简化了内存管理,避免了复杂的加锁逻辑。
    • 负面: 导致 Python 的多线程无法利用多核 CPU 进行并行计算。对于 CPU 密集型任务,多线程甚至会因为线程切换的开销而变得更慢。
  4. 怎么解决 (How):
    • IO 密集型任务: 多线程依然有效。因为线程在等待网络/硬盘 IO 时会主动释放 GIL,让其他线程执行。
    • CPU 密集型任务: 必须使用多进程 (multiprocessing),因为每个进程有自己独立的 GIL。

2. 问:is==有什么区别?

参考回答:

  • ==比较的是两个对象的值 (value)是否相等。
  • is比较的是两个对象的身份标识 (identity)是否相等,即它们是否指向内存中的同一个对象 (id(a) == id(b))。

示例:

a=[1,2,3]b=[1,2,3]c=aprint(a==b)# True (值相等)print(aisb)# False (内存地址不同)print(aisc)# True (指向同一个对象)

追问:a = 1000; b = 1000; a is b是 True 还是 False?

答:是 False。CPython 为了优化性能,会缓存一小部分整数(通常是 -5 到 256)。在这个范围内,is会返回 True。但超出这个范围,Python 会创建新的对象,所以是 False。


3. 问:什么是深拷贝 (Deep Copy) 和浅拷贝 (Shallow Copy)?

参考回答:

  • 浅拷贝 (copy.copy()list.copy()): 创建一个新的对象,但如果原始对象中包含子对象(如列表中的列表),则只拷贝子对象的引用。修改子对象会相互影响。
  • 深拷贝 (copy.deepcopy()): 创建一个全新的对象,并递归地拷贝所有子对象。拷贝后的对象与原始对象完全独立。

示例:

importcopy a=[1,[10,20]]# 浅拷贝b=copy.copy(a)b[1][0]=999print(f"修改浅拷贝后, 原列表 a:{a}")# a 也被修改了 -> [1, [999, 20]]# 深拷贝c=copy.deepcopy(a)c[1][0]=111print(f"修改深拷贝后, 原列表 a:{a}")# a 不受影响 -> [1, [999, 20]]

二、数据结构

4. 问:列表 (List) 和元组 (Tuple) 的区别?

参考回答:

  1. 可变性: 列表是可变 (mutable)的,元组是不可变 (immutable)的。这是最本质的区别。
  2. 性能: 因为不可变,元组的结构更固定,通常比列表更省内存速度也稍快
  3. 用途:
    • 当数据需要被修改时,用列表。
    • 当数据是固定的,不希望被修改时,用元组。比如,元组可以作为字典的键集合的元素,而列表不行。

5. 问:字典 (Dict) 的底层实现原理是什么?为什么查找是 O(1)?

参考回答:

  1. 底层结构: 字典的底层是哈希表 (Hash Table)。它是一个稀疏数组,通过哈希函数将键 (key) 映射到数组的索引上。
  2. 查找过程:
    • 计算hash(key)得到哈希值。
    • 哈希值对数组长度取模,得到存储位置(索引)。
    • 直接访问该索引即可。
  3. 为什么是 O(1): 在理想情况下(没有哈希冲突),查找、插入、删除都只需要一次计算,时间复杂度是 O(1)。
  4. 哈希冲突: 如果两个不同的 key 算出了同一个索引,就发生了哈希冲突。Python 使用开放寻址法来解决冲突(寻找下一个空位)。当冲突增多时,性能会下降到 O(n)。

三、Pythonic 写法

6. 问:请用至少三种方法反转一个字符串 “hello”。

参考回答:

  1. 切片 (最 Pythonic):s[::-1]
  2. reversed()+join():"".join(reversed(s))
  3. 循环:
    res=""forcharins:res=char+res

7. 问:什么是列表/字典推导式?请举例。

参考回答:
推导式是一种用一行代码快速创建列表或字典的简洁语法,可读性强且效率高。

  • 列表推导式:
    # 找出 1-10 的偶数的平方squares=[x**2forxinrange(1,11)ifx%2==0]
  • 字典推导式:
    # 快速交换 key 和 valuemy_dict={"a":1,"b":2}swapped={v:kfork,vinmy_dict.items()}

四、如何回答面试题

  1. 先给结论: 直接、清晰地回答问题的核心。
  2. 再做解释: 阐述背后的原理和细节。
  3. 举例说明: 用简短的代码或场景来支撑你的解释。
  4. 对比分析: 给出不同方案的优缺点和适用场景。

系列导航

  • 上一篇:Day 96 - 常用库速查手册
  • 下一篇:Day 98 - 常见面试题解析 (中)(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/23 5:59:39

测试工程师都在用的Linux命令清单(建议收藏)

作为一名工程师,熟练掌握Linux命令是基本功中的基本功。无论是日常工作中的系统维护,还是面试时的技术考核,Linux命令都是绕不开的核心技能。本文将从实战角度出发,系统梳理工程师必须掌握的Linux命令,并结合实际场景解…

作者头像 李华
网站建设 2026/2/20 5:50:02

从压测到调优:一次完整的性能测试实战复盘

在企业中完成性能测试项目是一个挑战性强、技术含量高的任务。本文将分享一个公司完成高性能游戏系统的性能测试过程,展示如何完成一次成功的性能测试项目。 项目背景:这是一家游戏公司,推出了一款新的游戏软件,系统要求高性能、…

作者头像 李华
网站建设 2026/2/19 16:43:09

《P2520 [HAOI2011] 向量》

题目描述给你一对数 (a,b),你可以任意使用 (a,b),(a,−b),(−a,b),(−a,−b),(b,a),(b,−a),(−b,a),(−b,−a) 这些向量,问你能不能拼出另一个向量 (x,y)。说明:这里的拼就是使得你选出的向量之和为 (x,y)。输入格式第一行数组组数 t(t≤500…

作者头像 李华
网站建设 2026/2/18 18:29:44

设计模式学习(15) 23-13 模版方法模式

文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析0.个人感悟 个人对这个模式印象很深,属于是工作中自己无意识地用到过,后面看书才发现原来已…

作者头像 李华