news 2026/5/1 8:36:36

Python 常见问题梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 常见问题梳理

一、基础语法问题

1.缩进错误

# 错误示例ifTrue:print("Hello")# IndentationError# 正确示例ifTrue:print("Hello")

2.变量作用域混淆

x=10deffunc():x=20# 这是局部变量print(x)# 20func()print(x)# 10# 使用 global 关键字deffunc2():globalx x=30print(x)# 30

3.可变默认参数陷阱

# 错误示例deffunc(items=[]):items.append(1)returnitemsprint(func())# [1]print(func())# [1, 1] ❌# 正确示例deffunc(items=None):ifitemsisNone:items=[]items.append(1)returnitems

二、数据结构常见问题

1.列表浅拷贝 vs 深拷贝

importcopy# 浅拷贝list1=[[1,2],[3,4]]list2=list1.copy()# 或 list2 = list1[:]list1[0][0]=99print(list2)# [[99, 2], [3, 4]] ❌# 深拷贝list3=copy.deepcopy(list1)list1[0][0]=100print(list3)# [[99, 2], [3, 4]] ✅

2.字典键必须是不可变类型

# 错误示例# d = {[1,2]: "value"} # TypeError# 正确示例d={(1,2):"value",# 元组可以作为键"key":"value",123:"value"}

3.集合去重原理

# 基于 __hash__ 和 __eq__ 方法classPerson:def__init__(self,name,age):self.name=name self.age=agedef__hash__(self):returnhash((self.name,self.age))def__eq__(self,other):returnself.name==other.nameandself.age==other.age p1=Person("Alice",25)p2=Person("Alice",25)print(len({p1,p2}))# 1

三、函数与方法

1.参数传递方式

# 不可变对象:传值defmodify_num(x):x=100num=10modify_num(num)print(num)# 10# 可变对象:传引用defmodify_list(lst):lst.append(4)my_list=[1,2,3]modify_list(my_list)print(my_list)# [1, 2, 3, 4]

2.lambda 函数限制

# lambda 只能包含单个表达式# 错误:lambda x: if x>0: return x else: return -x# 正确:abs_val=lambdax:xifx>0else-x# 复杂的逻辑应该使用普通函数

3.闭包变量绑定

# 常见问题functions=[]foriinrange(3):functions.append(lambda:print(i))forfinfunctions:f()# 全部输出 2 ❌# 解决方案functions=[]foriinrange(3):functions.append(lambdax=i:print(x))forfinfunctions:f()# 0, 1, 2 ✅

四、面向对象编程

1.类变量与实例变量

classMyClass:class_var=0# 类变量def__init__(self,value):self.instance_var=value# 实例变量obj1=MyClass(1)obj2=MyClass(2)obj1.class_var=99# 创建实例属性,不会修改类变量MyClass.class_var=100# 修改类变量

2.继承与 super()

classParent:def__init__(self):print("Parent init")classChild(Parent):def__init__(self):super().__init__()# Python 3 语法print("Child init")

3.特殊方法strvsrepr

classPoint:def__init__(self,x,y):self.x=x self.y=ydef__str__(self):returnf"Point({self.x},{self.y})"def__repr__(self):returnf"Point(x={self.x}, y={self.y})"p=Point(1,2)print(str(p))# Point(1, 2)print(repr(p))# Point(x=1, y=2)

五、异常处理

1.正确捕获多个异常

try:# 可能出错的代码result=10/0except(ZeroDivisionError,ValueError)ase:print(f"Error:{e}")exceptExceptionase:print(f"Unexpected error:{e}")finally:print("Cleanup")

2.避免空的 except 语句

# 错误示例try:do_something()except:pass# 会捕获所有异常,包括 KeyboardInterrupt# 正确示例try:do_something()exceptExceptionase:# 不会捕获 KeyboardInterrupt, SystemExitlog_error(e)

六、模块与包

1.循环导入问题

# module_a.pyimportmodule_b# ❌ 循环导入deffunc_a():frommodule_bimportfunc_b# ✅ 延迟导入returnfunc_b()

2.name== “main

# 模块可以自己运行,也可以被导入defmain():print("This is the main function")if__name__=="__main__":main()# 直接运行脚本时执行

七、性能与内存

1.字符串拼接优化

# 低效result=""foriinrange(10000):result+=str(i)# 高效result="".join(str(i)foriinrange(10000))

2.列表推导式 vs 循环

# 更简洁且通常更快squares=[x**2forxinrange(10)ifx%2==0]# 生成器表达式(节省内存)squares_gen=(x**2forxinrange(10)ifx%2==0)

3.内存泄漏:循环引用

importgcclassNode:def__init__(self):self.parent=Noneself.children=[]# 创建循环引用parent=Node()child=Node()parent.children.append(child)child.parent=parent# 手动打破循环引用或使用弱引用importweakref child.parent=weakref.ref(parent)

八、Pythonic 编程

1.使用 enumerate

# 不推荐foriinrange(len(items)):print(i,items[i])# 推荐fori,iteminenumerate(items):print(i,item)

2.使用 zip

names=["Alice","Bob","Charlie"]ages=[25,30,35]forname,ageinzip(names,ages):print(f"{name}is{age}years old")

3.上下文管理器

# 传统方式f=open("file.txt","r")try:data=f.read()finally:f.close()# 使用 with 语句withopen("file.txt","r")asf:data=f.read()

九、常见错误与调试

1.TypeError: ‘X’ object is not callable

# 通常是因为把变量名用作函数list=[1,2,3]# ❌ 覆盖了内置函数 list# list( (4,5,6) ) # 错误!lst=[1,2,3]# ✅ 使用不同的变量名

2.AttributeError: module ‘X’ has no attribute ‘Y’

# 常见原因:# 1. 拼写错误# 2. 未正确导入子模块# 3. 有同名的.py文件在搜索路径中

3.使用调试工具

importpdbdefbuggy_function():pdb.set_trace()# 设置断点# 调试代码# 常用命令:n(ext), s(tep), c(ontinue), l(ist), p(rint)

十、版本差异

Python 2 vs Python 3

# 1. print 函数print"Hello"# Python 2print("Hello")# Python 3# 2. 整数除法3/2# Python 2: 1, Python 3: 1.53//2# 两者都是: 1# 3. Unicodestr_type=type("hello")# Python 2: <type 'str'>, Python 3: <class 'str'>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:54:29

Rembg模型评估:定量分析指标与方法

Rembg模型评估&#xff1a;定量分析指标与方法 1. 智能万能抠图 - Rembg 在图像处理与计算机视觉领域&#xff0c;背景去除&#xff08;Image Matting / Background Removal&#xff09;是一项基础但极具挑战性的任务。传统方法依赖人工标注、色度键控或边缘检测算法&#xf…

作者头像 李华
网站建设 2026/5/1 8:02:21

如何用AI看懂2D图像的3D结构?MiDaS大模型镜像实操指南

如何用AI看懂2D图像的3D结构&#xff1f;MiDaS大模型镜像实操指南 &#x1f9e0; 什么是单目深度估计&#xff1f;让AI“感知”三维空间 我们生活在一个三维世界&#xff0c;但手机、相机拍下的照片却是二维的——丢失了“远近”这一关键维度。单目深度估计&#xff08;Monocul…

作者头像 李华
网站建设 2026/4/18 16:59:34

ResNet18环境配置太麻烦?云端镜像开箱即用,省时90%

ResNet18环境配置太麻烦&#xff1f;云端镜像开箱即用&#xff0c;省时90% 1. 为什么你需要ResNet18云端镜像 作为算法工程师&#xff0c;你一定遇到过这样的场景&#xff1a;换新电脑后&#xff0c;光是配置ResNet18的开发环境就耗费一整天时间。CUDA版本冲突、PyTorch版本不…

作者头像 李华
网站建设 2026/5/1 8:15:17

测试报告可视化革命:用Grafana构建专业级测试仪表盘

在敏捷开发和DevOps实践中&#xff0c;测试团队常面临数据孤岛和指标碎片化的问题。传统静态测试报告难以实时反映系统质量全貌&#xff0c;而Grafana凭借其强大的可视化能力和灵活的生态&#xff0c;正成为测试工程师的决策中枢。本文将深入解析如何构建专业级测试仪表盘&…

作者头像 李华