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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。