想进大厂做Python开发?这些面试题你必须会
想进大厂做Python开发?这些面试题你必须会

大厂Python面试,到底在考什么?

我帮不少学员做过Python面试辅导,也自己也参加过不少面试。

说个可能让你意外的事实:大厂面试Python,考的往往不是你写了多少年代码,而是你对Python底层的理解深度。

今天我整理了6道高频面试题,都是我自己和学员在面试中真实遇到的。建议你先自己想想答案,再看我的解析。

面试题1:Python的GIL是什么?它对多线程有什么影响?

这道题几乎是Python面试的必考题。

参考答案

GIL(Global Interpreter Lock,全局解释器锁)是CPython中的机制,它保证同一时刻只有一个线程在执行Python字节码。

影响:

  • 多线程无法真正利用多核CPU——即使是多线程程序,同一时刻也只有一条线程在运行
  • IO密集型任务不受影响——因为IO操作时会释放GIL
  • CPU密集型任务应该用多进程——每个进程有独立的GIL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# CPU密集型 → 多进程
from multiprocessing import Pool

def cpu_task(n):
return sum(i*i for i in range(n))

with Pool(4) as p:
results = p.map(cpu_task, [10**7] * 4)

# IO密集型 → 多线程
import threading

def io_task():
import time
time.sleep(1)

threads = [threading.Thread(target=io_task) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()

面试题2:谈谈Python的垃圾回收机制

参考答案

Python使用引用计数为主、标记-清除分代回收为辅的垃圾回收机制。

  • 引用计数:每个对象维护一个引用计数器,计数为0时立即回收
  • 标记-清除:处理循环引用的情况
  • 分代回收:把对象分成3代,新对象在第0代,存活越久代数越高,回收频率越低
1
2
3
4
5
6
7
8
import gc
import sys

a = [1, 2, 3]
print(sys.getrefcount(a)) # 引用计数(结果通常为2,因为getrefcount也引用了它)

# 手动触发垃圾回收
gc.collect()

面试题3:深拷贝和浅拷贝有什么区别?

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
import copy

a = [[1, 2], [3, 4]]

# 浅拷贝:只复制外层对象,内层还是引用
b = a.copy() # 或 copy.copy(a)
b[0][0] = 99
print(a) # [[99, 2], [3, 4]] ← a也被修改了!

# 深拷贝:递归复制所有层级的对象
c = copy.deepcopy(a)
c[0][0] = 88
print(a) # [[99, 2], [3, 4]] ← a不受影响

面试加分项:提到copy模块的__copy____deepcopy__魔术方法。

面试题4:装饰器是什么?手写一个带参数的装饰器

这道题既考概念,又考手写代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def repeat(times):
"""让函数重复执行指定次数的装饰器"""
def decorator(func):
def wrapper(*args, **kwargs):
results = []
for _ in range(times):
results.append(func(*args, **kwargs))
return results
return wrapper
return decorator

@repeat(times=3)
def get_lucky_number():
import random
return random.randint(1, 100)

print(get_lucky_number()) # [42, 17, 88]

面试题5:Python中*args**kwargs是什么?

1
2
3
4
5
6
7
def func(*args, **kwargs):
print(f"位置参数: {args}")
print(f"关键字参数: {kwargs}")

func(1, 2, 3, name="晚枫", role="程序员")
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': '晚枫', 'role': '程序员'}

加分项:知道*可以用来解包列表/字典:

1
2
3
args = [1, 2, 3]
kwargs = {"name": "晚枫"}
func(*args, **kwargs) # 等价于 func(1, 2, 3, name="晚枫")

面试题6:列表推导式和生成器表达式有什么区别?

1
2
3
4
5
6
7
# 列表推导式:立即计算,返回列表
list_comp = [x*x for x in range(1000000)]
# 占用大量内存

# 生成器表达式:惰性计算,返回生成器
gen_exp = (x*x for x in range(1000000))
# 几乎不占用内存,按需生成

核心区别:列表推导式一次性生成所有数据放在内存中,生成器表达式是按需生成。

🎯 面试准备建议

  1. 不仅要会答案,还要理解原理——面试官喜欢追问"为什么"
  2. 手写代码要熟练——很多面试要求在线写代码,不能用IDE
  3. 准备项目经历——能讲清楚你做过的项目的技术难点和解决方案
  4. 刷LeetCode——算法题还是得练,这是硬实力

在「Python进阶」课程中,我专门有一章讲面试高频题,覆盖了基础、进阶、框架等各个维度。

👇 扫码添加微信,咨询Python进阶课程
微信号:aiwf365

相关阅读

程序员晚枫专注Python自动化办公和AI编程实战教学,github 1000+ star开源项目python-office作者。

🎓 AI 编程实战课程

想系统学习 AI 编程?程序员晚枫的 AI 编程实战课 帮你从零上手!