python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python避坑指南

Python新手必避的20个面试高频踩雷汇总(附源码+解决方案)

作者:我材不敲代码

本文整理了20个新手高频致命坑,覆盖默认参数、深浅拷贝、循环变量泄露、字符串驻留、整数缓存、GIL、异常捕获等内容,一篇彻底根治新手90%Bug

前言

很多人学 Python 基础语法很快,但写代码永远出Bug、面试频频答错、线上代码时不时崩溃。

其实不是你基础差,是 Python 有大量“语法看着对、实际全是坑”的隐性机制

今天我整理20个新手高频致命坑,覆盖:默认参数、深浅拷贝、循环变量泄露、字符串驻留、整数缓存、GIL、异常捕获、列表遍历、内存机制等,每条都有错误示例+原因+正确写法,一篇彻底根治新手90%Bug。

1、默认参数为可变对象(经典万年坑)

现象:多次调用函数,列表会累加、不会清空。

错误代码

def func(arr=[]):
    arr.append(1)
    print(arr)

func()
func()
# 输出:[1]、[1,1]

原因:默认参数在函数定义时只创建一次,不会每次调用重新生成。

正确写法

def func(arr=None):
    if arr is None:
        arr = []
    arr.append(1)
    print(arr)

2、for循环变量泄露

现象:循环结束后,循环变量依然存在,污染外部作用域。

错误

for i in range(3):
    pass
print(i) # 2,变量泄露

解决:避免外部复用同名变量,复杂逻辑抽函数。

3、遍历列表同时删除元素(漏删、错乱)

现象:遍历过程列表长度变化,索引错位,导致删不干净。

错误

lst = [1,2,3,4]
for i in lst:
    if i % 2 == 0:
        lst.remove(i)
print(lst) # [1,3] 看似对,复杂数据极易出错

正确:新建列表 / 倒序遍历

lst = [1,2,3,4]
new_lst = [x for x in lst if x % 2 != 0]
print(new_lst)

4、== 和 is 混用

== 判断值相等is 判断内存地址完全一致

坑:小整数缓存、字符串驻留导致时而相等、时而不等。

规则:判断值用 ==,判断None、单例用 is。

5、整数缓存坑(-5~256)

Python 对 -5 ~ 256 整数常驻缓存,超出范围不缓存。

a = 256
b = 256
print(a is b) # True

c = 257
d = 257
print(c is d) # False(交互式环境)

6、字符串拼接大量 + 造成性能灾难

字符串不可变,每一次 + 都会生成新字符串

大量拼接永远用:"".join(list)

7、字典直接取值 KeyError 崩溃

d = {"name":"Tom"}
print(d["age"]) # 直接报错

推荐:d.get("age", 18)

8、浅拷贝坑:嵌套列表修改联动

a = [[1,2],3]
b = list(a)
b[0][0] = 99
print(a) # [[99,2],3] 原数据被改!

原因:浅拷贝只拷贝外层,内层依然引用。

嵌套结构必须用 deepcopy

9、裸 except 捕获所有异常

try:
    1/0
except:
    pass # 隐藏所有Bug,线上致命

永远捕获具体异常

10、文件 open 不关闭,资源泄露

不手动 close 会导致句柄泄露、文件占用、无法删除。

一律用 with 上下文管理器

11、全局变量修改不声明 global

num = 10
def f():
    num = 20 # 新建局部变量,不修改全局
f()
print(num) # 10

需要修改全局必须加 global

12、闭包延迟绑定(面试超级大坑)

funcs = []
for i in range(3):
    def f():
        print(i)
    funcs.append(f)

funcs[0]() # 2
funcs[1]() # 2
# 全部输出最后 i 的值,延迟绑定

解决:传参立即绑定

13、True/False 本质是 1/0

print(True == 1)  # True
print(False == 0) # True

判断布尔值不要和数字混用!

14、if 多条件连续赋值坑

a = 0
if a == 1 or 2:
    print("成立") # 永远成立!

2 永远为真,新手高频逻辑错误。

15、列表、字典作为布尔判断

空列表、空字典、空字符串、0、None 为 False,其余 True。

极易出现逻辑误判。

16、递归深度溢出

Python 默认递归深度 1000,深递归直接报错。

复杂递归优先迭代实现。

17、time.sleep 阻塞整个线程

协程中不能用 time.sleep,会阻塞事件循环。

协程必须用 await asyncio.sleep()

18、多线程高估效率(GIL坑)

CPU密集任务多线程变慢不提速,必须多进程。

19、函数返回多个值默认元组

def test():
    return 1,2
res = test()
print(type(res)) # tuple

接收不规范极易出现解包报错。

20、编码不指定导致乱码

Windows 默认 GBK,Linux 默认 UTF-8。

所有 open 强制指定 encoding="utf-8"

总结:20个坑速记(收藏版)

Python 看似简洁自由,实则隐性坑非常多

很多工作几年的开发者依然在踩这些老坑。

以上就是Python新手必避的20个面试高频踩雷汇总(附源码+解决方案)的详细内容,更多关于Python避坑指南的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文