Python 经常因其简单性而受到称赞,但让我们面对现实吧——无论你的经验多么丰富,它都有办法让即使是最优秀的开发人员也感到谦卑。
老实说,这并不是坏事。每次遇到困难,都是一次升级的机会。
在本文中,我将解析 10 个常见的 Python 错误、它们发生的原因,以及——最重要的是——如何快速解决它们。
把它视为你的 Python 错误搜寻指南。
1. 循环中的 Off-by-One 错误
问题:
在迭代列表或范围时,你可能会意外地将一个索引移得太远 — — 或者过早停止一个索引。典型的例子:
my_list = [ 1 , 2 , 3 ]
for i in range ( len (my_list)):
print (my_list[i + 1 ]) # IndexError: 列表索引超出范围
发生原因:
Python 索引从 0 开始,但有时您的大脑却不是这样。
修复:
始终仔细检查循环边界。更好的方法是使用 Pythonenumerate
以避免手动摆弄索引。
my_list = [ 1 , 2 , 3 ]
for i, value in enumerate (my_list):
print (value) # 这里没有错误!
2. 可变默认参数
问题:
使用可变的默认参数(如列表或字典)会导致令人惊讶的行为:
def add_item ( item, item_list=[] ):
item_list.append(item)
return item_list
print (add_item( 1 )) # [1]
print (add_item( 2 )) # [1, 2] (等一下,什么?!)
发生原因:
默认参数在函数定义时被评估一次,而不是每次调用时都评估。
修复:
用作None
默认值并在函数内部初始化。
def add_item ( item, item_list= None ):
如果item_list为 None :
item_list = []
item_list.append(item)
返回item_list
3. 误用is替代==
问题:
is
用而不是来比较两个值==
。这种方法效果不可预测,因为is
检查的是对象身份,而不是相等性。
a = [ 1 , 2 , 3 ]
b = [ 1 , 2 , 3 ]
print (a is b) # False
print (a == b) # True
发生原因:
当你习惯于其他语言或者只是匆忙时,很容易出现失误。
修复:
用于==
值比较,除非您明确需要检查两个变量是否指向同一个对象。
4.导入错误的模块
问题:
意外导入了与您自己的脚本同名的模块:
# my_script.py
导入random
def random ():
return "哎呀,这会覆盖 random 模块。"
print ( random .randint( 1 , 10 )) # AttributeError: 'function'对象没有属性'randint'
发生原因:
Python 在导入模块时首先搜索当前目录。
修复:
避免使用标准库或第三方包来命名文件。
5. 误解范围
问题:
修改函数内的变量而不将其声明为global
:
x = 10
def update_x ():
x += 1 # UnboundLocalError: 局部变量 'x' 在赋值之前被引用
update_x()
发生原因:
Python 假定函数内的变量是本地的,除非另有声明。
修复:
使用global
或者更好的是,传递变量作为参数并返回更新的值。
x = 10
def update_x( val ):
返回 val + 1
x = update_x(x)
6.忘记关闭文件
问题:
不正确关闭文件可能会导致内存泄漏或文件锁定。
file = open( 'example.txt' , 'r' )
data = file.read()
# 缺少 file.close()
发生原因:
我们忘记了。这是人之常情。
修复:
始终使用上下文管理器(with
语句)。
使用 open ( 'example.txt' , 'r' )作为文件:
data = file.read()
7. ZeroDivisionError
问题:
尝试除以零,无论是有意还是无意。
x = 1 / 0 # 零分割错误
发生原因:
在数学中,除以零是未定义的。Python 只是遵循规则。
修复:
除法之前检查分母:
def safe_divide ( a, b ): 如果b != 0则
返回a / b否则float ( 'inf' )
8. 使用错误的异常
问题:
捕获广泛的异常而不是针对特定的错误:
try:
risky_code()
except Exception as e:
print(f"Something went wrong: {e}")
发生原因:
编写一个综合except
条款比较容易,但它可能会掩盖意外的错误。
修复:
尽可能地捕获特定异常。
try:
risky_code()
except ValueError:
print("ValueError occurred.")
except ZeroDivisionError:
print("Cannot divide by zero.")
9. 字典键中的拼写错误
问题:
使用拼写错误的键访问字典:
data = {'name': 'Alice', 'age': 25}
print(data['nam']) # KeyError: 'nam'
发生原因:
Python 不会自动更正键(幸运的是)。
修复:
用于dict.get()
更安全的访问,或在访问之前验证密钥。
print(data.get('nam', 'Key not found')) # "Key not found"
10. 版本不匹配问题
问题:
由于库或 Python 版本差异导致的代码中断:
import pandas as pd
print(pd.DataFrame.from_dict({'a': [1]}, orient='index')) # ValueError in older Pandas versions
发生原因:
Python 2 和 3 之间的库更新或差异(如果您仍在使用 Python 2,我们需要讨论一下)。
修复:
始终将库版本固定在您的虚拟环境中requirements.txt
并在虚拟环境中进行测试。
pandas==1.5.3
评论(0)