昨天学了四要素,AI 一次写对的概率能到八成——那剩下两成怎么办?报错了怎么办?想改功能怎么办?今天解决这两件事:报错三步法和追问修改。
先说个场景。程序报错了,新手最常见的操作是:把报错信息看完,然后转头对 AI 说一句「我这个好像报错了」。这等于去医院看病,不说自己哪里疼,只说"我不舒服"。报错信息里藏着文件名、行号、错误类型这些线索,你转述一通,线索全丢了,AI 只能靠猜。
再说追问。AI 第一次写的代码,几乎永远不完全符合你的要求。高手和菜鸟的分水岭就在这儿:菜鸟把需求重新描述一遍,AI 从头重写,你之前修好的东西全冲掉;高手只说"改哪里、改成什么样、其他别动"。
两招学完,你就有了完整的 AI 协作闭环。
报错三步法
遇到报错,按下面三步组织提问,AI 能一次修对:
| 步骤 | 内容 | 作用 |
|---|---|---|
| ① 发生了什么 | "我在运行 xxx 时报错" | 给 AI 场景上下文 |
| ② 报错原文 | 直接粘贴报错信息,一字不改 | 提供诊断线索(文件名、行号、错误类型) |
| ③ 你的水平 | "我是初学者,请用大白话解释原因并给出修改后的完整代码" | 让 AI 讲解 + 直接给能跑的代码 |
三步法模板,直接复制:
1. 发生了什么:我在运行 <程序名> 时报错。
2. 报错原文:
<粘贴完整报错信息,包括文件名、行号、错误类型>
3. 我是 Python 零基础初学者,请用大白话解释报错原因,并给出修改后的完整代码。
第 3 步里那句"给出修改后的完整代码"别小看——不要只让 AI 说"你这里少了个引号"然后你自己改,直接让它给完整代码,你复制、运行、验证,学习效率最高。
报错信息通常很长(带一串调用栈),全部粘贴,不要只贴最后一行。最后一行只是"结论",上面的行号才是"案发现场"。报错信息里如果含你的隐私路径(比如 C:\Users\你的名字\...),可以手动把名字换成 xxx,其余保留。三个要素缺一不可:没有"发生了什么",AI 不知道你在哪个程序里报的错;没有原文,AI 只能靠猜。
铁律:报错原文,一字不改地粘贴
这句话是今天最重要的,务必记牢:报错一定要粘贴原文,不要自己描述。
为什么?AI 靠报错里的三类信息定位问题:
| 报错里的线索 | AI 怎么用它 |
|---|---|
文件名 + 行号(File "test.py", line 7) |
直接锁定是哪一行出的问题 |
错误类型(SyntaxError / NameError / IndexError) |
判断是哪一类错误,用对应思路修 |
错误描述(name 'x' is not defined) |
精确知道少了什么、拼错了什么 |
你转述成"好像有个东西没定义"——这些线索全没了,AI 只能猜,猜错概率极高。
自己转述还有个隐藏陷阱:你以为的原因 ≠ 真正的原因。新手经常看错报错,把 TypeError 说成"我是不是标点错了",AI 就被带偏到错误方向。所以:不转述、不翻译、不总结,直接复制。
看一个正确的演示。假设你运行这段代码报错:
# test.py
name = "小明"
print(名字) # 故意把变量名写错
终端里显示的红字报错,原样复制:
Traceback (most recent call last):
File "test.py", line 2, in <module>
print(名字)
NameError: name '名字' is not defined
正确发给 AI 的提问长这样:
1. 发生了什么:我在运行 test.py 时报错。
2. 报错原文:
Traceback (most recent call last):
File "test.py", line 2, in <module>
print(名字)
NameError: name '名字' is not defined
3. 我是 Python 零基础初学者,请用大白话解释报错原因,并给出修改后的完整代码。
"复制"报错 = 选中终端里的报错文字 → Ctrl+C(Windows),别手敲,手敲必漏字符。报错里有中文变量名(如上例)也没问题,原文是什么就粘什么。修好一次就总结经验:把报错类型 + 原因写进自己的"报错笔记",积累越多,报错越少。
让 AI 逐行解释代码
除了写代码和修报错,AI 第三个大用途是解释代码。看不懂 AI 生成的代码、看不懂网上的例子、看不懂同学写的代码,都靠它。模板:
请逐行解释这段代码在做什么,用大白话,适合零基础:
<粘贴代码>
按需加后缀,效果更佳:
请解释每一行的作用,并指出最关键的一行。请解释完后再用一句话总结这段代码的整体功能。如果我要修改 XX 功能,应该改哪几行?
比如把昨天写的 Student 类粘给它:
请逐行解释这段代码在做什么,用大白话,适合零基础:
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def show(self):
print(f"{self.name}:{self.score} 分")
s = Student("小明", 95)
s.show()
AI 大概会这样回复(示范格式,不必背):
第 1 行:class Student: 定义一个叫 Student 的类(图纸)……
第 2-4 行:__init__ 是造对象时自动执行的方法,self.name = name 把传入的名字存到对象自己身上……
第 8-9 行:创建小明这个学生对象,并调用 show() 方法打印结果……
学完解释后一定要做最后一步:合上 AI 的回答,把这段代码复述/复写给同桌听。能讲清楚,才是真懂——这是本周最被低估的练习。
解释代码时把"上下文"带上:如果这段代码依赖文件里的其他部分,把整个文件都粘进去,AI 才不会瞎猜。别只贴不读:AI 解释完,指着每一行对着原代码看一遍,不理解的再追问("这一行为什么这样写")。让 AI 解释 ≠ 让 AI 背课文,要求它"用大白话、举例、和之前学的语法关联"。
想改功能?别重述需求,直接说"改哪"
追问(follow-up) 指:AI 生成第一版代码后,你不满意或想加功能时,直接说"要改什么",而不是重新描述一遍需求。
为什么不能重新描述?看这个反面例子:
❌ 错误做法(重新描述):
请帮我写一个通讯录,要能添加联系人、查看全部、按姓名搜索,数据存 JSON……
这样做 AI 会从头再写一遍——你之前改好的功能、修好的 bug 全被冲掉,还可能引入新错误。而且你啥都没说清"到底哪里不对"。
正确做法是增量修改:指出具体位置 + 具体改法:
✅ 正确做法(追问修改):
代码能跑了,但有两点要改:
1. 删除联系人后要提示"删除成功"
2. 按姓名搜索时,输入大小写不敏感
请只修改这两个地方,其他不要动。
重新描述和追问修改的区别,看这张表:
| 对比项 | 重新描述需求 | 追问修改 |
|---|---|---|
| AI 行为 | 从头重写一遍 | 只在指定位置改动 |
| 已修好的 bug | 可能被冲掉 | 保留 |
| 消息长度 | 长,重复 | 短,聚焦 |
| 适合场景 | 需求大改、推翻重来 | 小调整、加功能 |
追问前先确认"代码能跑":代码跑不起来先走三步法修 bug,再谈改功能,别混在一段话里。一次追问别塞太多需求,2~3 个最合适,太多 AI 容易顾此失彼。追问的每一条都用"动作 + 结果"写清楚:不是"搜索那里不太好",而是"搜索时忽略大小写"。
追问金句:只改 XXX,其他不要动
追问修改里有一句含金量最高的话,单独拿出来讲:
追问金句:「只改 XXX,其他不要动。」
它的作用是给 AI 画一条"修改边界"。AI 生成代码时经常"顺手"帮你改别的——可能改坏了,可能改了你看不懂,可能改了注释风格。加了这句话,AI 会尽量只在指定范围动手,其他代码原样保留。
使用的时机:
| 时机 | 例子 |
|---|---|
| 要求改功能 | "只改搜索功能,其他不要动" |
| 要求改样式 | "只改提示语,其他不要动" |
| 要求加注释 | "只给每个函数加注释,代码逻辑不要动" |
| 要求改格式 | "只把价格改成保留两位小数,其他不要动" |
完整追问示例:
代码能跑了,请帮我做两处修改:
1. 添加联系人成功后,打印"添加成功"
2. 价格显示保留两位小数(如 19.90 元)
只修改这两处,其他代码不要动。
"其他不要动"是防呆保险,不是万能符:如果 AI 改错了,继续追问修正即可,别发火,这是正常现象。追问后必须重新运行验证:AI 可能只改了代码没改注释,或者改完引入新 bug,以运行结果为准。同一段对话里连续追问的效果最好:AI 记得上下文,你每次只发"增量"就够了。
建一个自己的报错错题本
今天制造报错、修报错,最容易犯的毛病是"修完就忘"。聪明的新手会把每一次报错记进错题本——这就是把 AI 变成"陪练",把自己练成"老手"。
错题本格式(笔记本或笔记软件里建一个表,每次报错加一行):
| 报错类型 | 我的代码(出错那行) | 原因(大白话) | 修法 |
|---|---|---|---|
NameError |
print(nmae) |
变量名拼错了 | 对照定义检查拼写 |
SyntaxError |
print("hello) |
字符串少了个引号 | 引号成对出现 |
IndexError |
nums[5],列表只有 3 个 |
下标越界 | 下标最大是 len-1 |
为什么值得记?因为新手的报错高度重复——翻来覆去就是拼写、引号、缩进、越界这几种。记过一遍,下次 10 秒定位。错题本就是你的"私有报错速查表",比任何教材都贴合你真实的犯错习惯。以后面试或考试,老师问"你踩过什么坑",你张口就能举 3 个——这是实打实的经验证明。
记的时候注意:别只记报错原文不记原因,错题本的价值在"原因"那一列,那是你自己想明白的过程。每周翻一次,把已经不会再犯的条目划掉——看着条目变少,就是你成长的进度条。报错让 AI 修完后,再自己手改一遍:AI 改的是它的代码,你改一遍才是你的经验。
随堂练习
练习一:故意制造 3 个报错,用三步法让 AI 修(今天的核心练习)
按下面 3 种方式各制造一个报错,复制完整报错,用三步法模板发给 AI,要求它解释原因并给完整修改代码:
- 少引号:
print("hello)——少写右边的双引号 - 变量名拼错:
name = "小明"; print(nmae) - 下标越界:
nums = [1, 2, 3]; print(nums[5])
做完后把 3 个报错的"错误类型 + 原因"记进笔记,你会发现它们都是高频坑。
练习二:追问 3 次小需求(练习"只改这些,其他不要动")
- 用昨天(周三)的四要素模板让 AI 生成一个"成绩管理系统"。
- 连续追问 3 次,每次都是小改动,每次都加"只改这些,其他不要动":
- 第一次:成绩打印时显示"分"字(如 95 分)
- 第二次:平均分保留一位小数
- 第三次:给每个函数加一行中文注释
- 每次追问后都运行一次,确认旧功能没被改坏。
进阶题 ★:解释 → 复述(学得最扎实的收尾)
- 从你的成绩管理系统里挑一段最复杂的代码(比如计算平均分那段)。
- 用"解释代码"模板让 AI 逐行讲解。
- 不看 AI 的回答,把这段代码的每一行作用讲给你的同桌听;讲不出来的地方再回去看 AI 的解释,直到能完整讲通。
直接复制的提示词
场景一:报错求助(三步法,每次报错都用它)
1. 发生了什么:我在运行 <程序名> 时报错。
2. 报错原文:
<粘贴完整报错信息>
3. 我是 Python 零基础初学者,请用大白话解释报错原因,并给出修改后的完整代码。
场景二:代码修改(追问,加"只改这些")
代码能跑了,请帮我改 <N> 处:
1. <要改什么,改成什么样>
2. <要改什么,改成什么样>
只修改这几处,其他代码不要动。
报错速查
| 报错信息 | 什么意思 | 怎么办 |
|---|---|---|
SyntaxError: unterminated string literal |
字符串缺了右边的引号(少引号报错) | 补上引号;以后报错一律走三步法,让 AI 精确定位 |
NameError: name 'xxx' is not defined |
变量名拼错或没定义就使用 | 检查拼写和定义顺序;报错原文里有错误名字,照着改 |
IndexError: list index out of range |
下标越界,访问了列表里不存在的序号 | 检查 nums[5] 这种取值,列表长度只有 3 时下标最大是 2 |
TypeError: ... |
类型或参数不匹配(比如字符串和数字做加法) | 把报错原文发给 AI,让它指出是哪一行的类型问题 |
| 复制报错给 AI 后它说"信息不够" | 你只粘了最后一行或自己转述了 | 把整段 Traceback 从第一行到最后一行全部粘贴 |
明天的总决战
今天两招:报错三步法(发生了什么 + 报错原文一字不改 + 我是初学者请给完整代码),追问修改(直接说"改哪里、改成什么样",再加一句"只改这些,其他不要动")。报错的铁律记一辈子:粘贴原文,别转述。
明天是本周的总决战:用图书管理小程序把这一周的东西全串起来——周一的类与对象、周二的封装、周三的四要素、今天的三步法和追问,全在一道题里过一遍。这也是你以后每个项目的标准套路:生成 → 测试 → 修改 → 自己重写。