想系统提升编程能力、查看更完整的学习路线,欢迎访问 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 学习资料都在这里,后续复习和拓展会更省时间。