Python 常见问题梳理
2026/4/21 16:13:10 网站建设 项目流程

一、基础语法问题

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'>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询