news 2026/5/13 15:58:01

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/9 7:13:19

Rembg图像分割实战:5分钟搭建高精度抠图系统

Rembg图像分割实战&#xff1a;5分钟搭建高精度抠图系统 1. 智能万能抠图 - Rembg 在图像处理领域&#xff0c;自动去背景&#xff08;Image Matting / Background Removal&#xff09;是一项高频且关键的需求。无论是电商商品图精修、证件照换底色&#xff0c;还是设计素材提…

作者头像 李华
网站建设 2026/5/10 9:43:33

Rembg模型监控方案:服务健康检查与告警

Rembg模型监控方案&#xff1a;服务健康检查与告警 1. 背景与挑战&#xff1a;Rembg服务的稳定性需求 随着AI图像处理技术在电商、设计、内容创作等领域的广泛应用&#xff0c;自动化去背景服务已成为许多业务流程中的关键环节。基于U-Net模型的Rembg因其高精度、无需标注、支…

作者头像 李华
网站建设 2026/5/12 3:43:00

ResNet18从零开始:没Linux经验?Windows也能轻松玩

ResNet18从零开始&#xff1a;没Linux经验&#xff1f;Windows也能轻松玩 引言 作为一名Windows用户&#xff0c;当你想要学习深度学习中的经典模型ResNet18时&#xff0c;是不是经常被各种Linux命令和复杂的开发环境配置劝退&#xff1f;别担心&#xff0c;这篇文章就是为你…

作者头像 李华
网站建设 2026/5/9 10:16:04

科技感拉满!用AI单目深度估计-MiDaS生成Inferno热力可视化图

科技感拉满&#xff01;用AI单目深度估计-MiDaS生成Inferno热力可视化图 [toc] 引言&#xff1a;让二维照片“感知”三维空间 在计算机视觉领域&#xff0c;从单张图像中恢复场景的深度信息是一项极具挑战但又极具价值的任务。传统方法依赖双目立体匹配或多帧运动视差&#x…

作者头像 李华
网站建设 2026/5/9 11:39:59

如何实现3D空间感知?用AI单目深度估计-MiDaS镜像轻松搞定

如何实现3D空间感知&#xff1f;用AI单目深度估计-MiDaS镜像轻松搞定 在自动驾驶、增强现实&#xff08;AR&#xff09;、机器人导航等前沿技术中&#xff0c;3D空间感知是构建环境理解能力的核心。然而&#xff0c;传统依赖双目相机或激光雷达的深度感知方案成本高、部署复杂…

作者头像 李华
网站建设 2026/5/12 15:41:06

【khbox补环境-3】原型链与 Illegal Invocation 保护机制

khbox 的项目已放gitee&#xff0c; https://gitee.com/sugarysp/khbox_pro &#xff0c;欢迎各位大佬使用测试。 目前完成的有 调用链追踪 document.all 原型保护以及toString c层调用链日志保存 illegal 保护机制 ps:可能有bug 待做&#xff1a; 异步 console.log 业务代码…

作者头像 李华