一、基础语法问题
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'>