一、基础语法问题 1.缩进错误 # 错误示例 if True : print ( "Hello" ) # IndentationError # 正确示例 if True : print ( "Hello" ) 2.变量作用域混淆 x= 10 def func ( ) : x= 20 # 这是局部变量 print ( x) # 20 func( ) print ( x) # 10 # 使用 global 关键字 def func2 ( ) : global x x= 30 print ( x) # 30 3.可变默认参数陷阱 # 错误示例 def func ( items= [ ] ) : items. append( 1 ) return itemsprint ( func( ) ) # [1] print ( func( ) ) # [1, 1] ❌ # 正确示例 def func ( items= None ) : if itemsis None : items= [ ] items. append( 1 ) return items二、数据结构常见问题 1.列表浅拷贝 vs 深拷贝 import copy# 浅拷贝 list1= [ [ 1 , 2 ] , [ 3 , 4 ] ] list2= list1. copy( ) # 或 list2 = list1[:] list1[ 0 ] [ 0 ] = 99 print ( list2) # [[99, 2], [3, 4]] ❌ # 深拷贝 list3= copy. deepcopy( list1) list1[ 0 ] [ 0 ] = 100 print ( list3) # [[99, 2], [3, 4]] ✅ 2.字典键必须是不可变类型 # 错误示例 # d = {[1,2]: "value"} # TypeError # 正确示例 d= { ( 1 , 2 ) : "value" , # 元组可以作为键 "key" : "value" , 123 : "value" } 3.集合去重原理 # 基于 __hash__ 和 __eq__ 方法 class Person : def __init__ ( self, name, age) : self. name= name self. age= agedef __hash__ ( self) : return hash ( ( self. name, self. age) ) def __eq__ ( self, other) : return self. name== other. nameand self. age== other. age p1= Person( "Alice" , 25 ) p2= Person( "Alice" , 25 ) print ( len ( { p1, p2} ) ) # 1 三、函数与方法 1.参数传递方式 # 不可变对象:传值 def modify_num ( x) : x= 100 num= 10 modify_num( num) print ( num) # 10 # 可变对象:传引用 def modify_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= lambda x: xif x> 0 else - x# 复杂的逻辑应该使用普通函数 3.闭包变量绑定 # 常见问题 functions= [ ] for iin range ( 3 ) : functions. append( lambda : print ( i) ) for fin functions: f( ) # 全部输出 2 ❌ # 解决方案 functions= [ ] for iin range ( 3 ) : functions. append( lambda x= i: print ( x) ) for fin functions: f( ) # 0, 1, 2 ✅ 四、面向对象编程 1.类变量与实例变量 class MyClass : 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() class Parent : def __init__ ( self) : print ( "Parent init" ) class Child ( Parent) : def __init__ ( self) : super ( ) . __init__( ) # Python 3 语法 print ( "Child init" ) 3.特殊方法str vsrepr class Point : def __init__ ( self, x, y) : self. x= x self. y= ydef __str__ ( self) : return f"Point( { self. x} , { self. y} )" def __repr__ ( self) : return f"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 / 0 except ( ZeroDivisionError, ValueError) as e: print ( f"Error: { e} " ) except Exceptionas e: print ( f"Unexpected error: { e} " ) finally : print ( "Cleanup" ) 2.避免空的 except 语句 # 错误示例 try : do_something( ) except : pass # 会捕获所有异常,包括 KeyboardInterrupt # 正确示例 try : do_something( ) except Exceptionas e: # 不会捕获 KeyboardInterrupt, SystemExit log_error( e) 六、模块与包 1.循环导入问题 # module_a.py import module_b# ❌ 循环导入 def func_a ( ) : from module_bimport func_b# ✅ 延迟导入 return func_b( ) 2.name == “main ” # 模块可以自己运行,也可以被导入 def main ( ) : print ( "This is the main function" ) if __name__== "__main__" : main( ) # 直接运行脚本时执行 七、性能与内存 1.字符串拼接优化 # 低效 result= "" for iin range ( 10000 ) : result+= str ( i) # 高效 result= "" . join( str ( i) for iin range ( 10000 ) ) 2.列表推导式 vs 循环 # 更简洁且通常更快 squares= [ x** 2 for xin range ( 10 ) if x% 2 == 0 ] # 生成器表达式(节省内存) squares_gen= ( x** 2 for xin range ( 10 ) if x% 2 == 0 ) 3.内存泄漏:循环引用 import gcclass Node : def __init__ ( self) : self. parent= None self. children= [ ] # 创建循环引用 parent= Node( ) child= Node( ) parent. children. append( child) child. parent= parent# 手动打破循环引用或使用弱引用 import weakref child. parent= weakref. ref( parent) 八、Pythonic 编程 1.使用 enumerate # 不推荐 for iin range ( len ( items) ) : print ( i, items[ i] ) # 推荐 for i, itemin enumerate ( items) : print ( i, item) 2.使用 zip names= [ "Alice" , "Bob" , "Charlie" ] ages= [ 25 , 30 , 35 ] for name, agein zip ( names, ages) : print ( f" { name} is { age} years old" ) 3.上下文管理器 # 传统方式 f= open ( "file.txt" , "r" ) try : data= f. read( ) finally : f. close( ) # 使用 with 语句 with open ( "file.txt" , "r" ) as f: 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.使用调试工具 import pdbdef buggy_function ( ) : pdb. set_trace( ) # 设置断点 # 调试代码 # 常用命令:n(ext), s(tep), c(ontinue), l(ist), p(rint) 十、版本差异 Python 2 vs Python 3 # 1. print 函数 print "Hello" # Python 2 print ( "Hello" ) # Python 3 # 2. 整数除法 3 / 2 # Python 2: 1, Python 3: 1.5 3 // 2 # 两者都是: 1 # 3. Unicode str_type= type ( "hello" ) # Python 2: <type 'str'>, Python 3: <class 'str'>