18 - 常见错误与调试技巧

2 阅读3分钟

想系统提升编程能力、查看更完整的学习路线,欢迎访问 AI Compass:github.com/tingaicompa… 仓库持续更新刷题题解、Python 基础和 AI 实战内容,适合想高效进阶的你。

18 - 常见错误与调试技巧

学习目标: 识别和解决常见Python错误


💻 常见错误

1. IndexError - 索引越界

nums = [1, 2, 3]

# ❌ 错误
# print(nums[3])  # IndexError: list index out of range

# ✅ 解决
if len(nums) > 3:
    print(nums[3])

# 或使用try-except
try:
    print(nums[3])
except IndexError:
    print("索引不存在")

2. KeyError - 键不存在

d = {"a": 1, "b": 2}

# ❌ 错误
# print(d["c"])  # KeyError: 'c'

# ✅ 解决方法1: 使用get
print(d.get("c"))  # None
print(d.get("c", 0))  # 0

# ✅ 解决方法2: 检查键是否存在
if "c" in d:
    print(d["c"])

# ✅ 解决方法3: defaultdict
from collections import defaultdict
d = defaultdict(int)
print(d["c"])  # 0 (不报错)

3. AttributeError - 属性不存在

# ❌ 错误
# s = "hello"
# s.append("x")  # AttributeError: 'str' object has no attribute 'append'

# ✅ 字符串是不可变的,用拼接
s = s + "x"

# None调用方法
# head = None
# head.val  # AttributeError: 'NoneType' object has no attribute 'val'

# ✅ 先检查None
if head:
    print(head.val)

4. TypeError - 类型错误

# ❌ 不能拼接字符串和整数
# print("age: " + 20)  # TypeError

# ✅ 转换类型
print("age: " + str(20))
# 或使用f-string
print(f"age: {20}")

# ❌ 列表不能作为字典的键
# d = {[1, 2]: "value"}  # TypeError: unhashable type: 'list'

# ✅ 使用元组
d = {(1, 2): "value"}

5. ValueError - 值错误

# ❌ 字符串转整数失败
# x = int("hello")  # ValueError

# ✅ 处理异常
try:
    x = int("hello")
except ValueError:
    x = 0

# ❌ 查找不存在的值
nums = [1, 2, 3]
# idx = nums.index(10)  # ValueError

# ✅ 先检查是否存在
if 10 in nums:
    idx = nums.index(10)

6. IndentationError - 缩进错误

# ❌ 错误
# def foo():
# print("hello")  # IndentationError

# ✅ 正确(4个空格缩进)
def foo():
    print("hello")

🛠️ 调试技巧

1. print调试

def binary_search(nums, target):
    left, right = 0, len(nums) - 1

    while left <= right:
        mid = (left + right) // 2
        print(f"left={left}, mid={mid}, right={right}, nums[mid]={nums[mid]}")

        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            left = mid + 1
        else:
            right = mid - 1

    return -1

2. assert断言

def divide(a, b):
    assert b != 0, "除数不能为0"
    return a / b

# divide(10, 0)  # AssertionError: 除数不能为0

3. type检查

def process(data):
    print(f"data的类型: {type(data)}")
    print(f"data的值: {data}")

process([1, 2, 3])
# data的类型: <class 'list'>
# data的值: [1, 2, 3]

🎯 算法题常见陷阱

1. 边界条件

# ❌ 忘记检查空数组
def max_val(nums):
    return max(nums)  # nums为空时报错

# ✅ 检查边界
def max_val(nums):
    if not nums:
        return None
    return max(nums)

2. 修改正在遍历的列表

# ❌ 错误
nums = [1, 2, 3, 4, 5]
for num in nums:
    if num % 2 == 0:
        nums.remove(num)  # 会跳过元素!

# ✅ 倒序遍历
for i in range(len(nums) - 1, -1, -1):
    if nums[i] % 2 == 0:
        nums.pop(i)

# ✅ 或创建新列表
nums = [x for x in nums if x % 2 != 0]

3. 浅拷贝vs深拷贝

# ❌ 浅拷贝
matrix = [[0] * 3] * 3
matrix[0][0] = 1
print(matrix)  # [[1, 0, 0], [1, 0, 0], [1, 0, 0]] (所有行都变了!)

# ✅ 深拷贝
matrix = [[0] * 3 for _ in range(3)]
matrix[0][0] = 1
print(matrix)  # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]

🎓 小结

IndexError: 检查索引范围 ✅ KeyError: 使用get()in检查 ✅ AttributeError: 检查None,确认方法存在 ✅ TypeError: 注意类型转换 ✅ ValueError: 使用try-except处理 ✅ IndentationError: 统一缩进(4空格)

调试技巧:

  • 使用print()输出中间结果
  • 使用assert检查假设
  • 使用type()查看类型

祝贺! 你已经完成了Python基础语法的学习! 🎉

下一步: 开始刷第1课:两数之和 🚀


如果这篇内容对你有帮助,推荐收藏 AI Compass:github.com/tingaicompa… 更多系统化题解、编程基础和 AI 学习资料都在这里,后续复习和拓展会更省时间。