Python 踩坑日记:那些 AI 没告诉我的事
AI 写的 Python 代码能跑,但有些坑,只有自己踩过才会懂。这是我这几个月攒下的真实记录。
写的时候的心情:一边骂一边学
我学 Python 的方式很”现代”:不啃教程,直接让 AI 帮我写小工具。爬虫、数据处理、自动化脚本,想要什么就让它写什么。
代码都能跑。但跑得起来和真的懂之间,隔着一整个我自己挖的坑群。
坑一:缩进,那个要命的缩进
AI 写的代码缩进永远是对的。但我自己手动改的时候——
def get_cats():
cats = []
for i in range(10):
cats.append(f"cat_{i}")
return cats # ← 看出来了吗?前面多了一个空格
报错信息是 IndentationError: unindent does not match any outer indentation level。第一次看到的时候我盯着这行字看了五分钟,完全不知道它在说什么。
后来才明白:Python 用缩进来表示代码块,多一个空格少一个空格都不行。 而 AI 永远不会犯这种错,所以它从来没”告诉”过我这件事有多重要。
这个坑让我学会了:自己手敲一遍 AI 给的代码,哪怕只是抄,也比复制粘贴学到的多十倍。
坑二:可变默认参数
这个是经典坑,但我还是踩了。
def add_cat(cat, box=[]): # ← 这个 [] 是个陷阱
box.append(cat)
return box
print(add_cat("橘猫")) # ['橘猫']
print(add_cat("黑猫")) # ['橘猫', '黑猫'] ← ???
我预期第二次调用应该是 ['黑猫'],结果第一次的猫还在盒子里。我以为 Python 坏了。
AI 解释给我听:函数的默认参数只在定义时计算一次。所以那个 [] 是所有调用共享的同一个列表。
正确写法:
def add_cat(cat, box=None):
if box is None:
box = []
box.append(cat)
return box
这种坑,AI 写代码时不会犯(它知道),但如果不踩一次、不理解为什么,我永远学不会自己判断。
坑三:环境,那个看不见的战场
有段时间我装一个库死活装不上,报错信息一大串。AI 让我”检查 Python 环境”,我不懂什么意思。
折腾了两天才搞明白:我电脑上装了三个 Python(系统自带的、Anaconda 的、某个软件捆绑的),pip install 装到了 A,但我运行时用的是 B,当然找不到。
那次之后我才真正理解什么叫虚拟环境。现在每次开新项目第一件事:
python -m venv .venv
.venv\Scripts\activate # Windows
不是为了显得专业,是为了不让自己再被这种破事折磨两天。
坑四:== 和 is
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True 值相等
print(a is b) # False 但不是同一个对象
这个还好理解。但有个更阴的:
x = 256
y = 256
print(x is y) # True
x = 257
y = 257
print(x is y) # False ???
Python 会缓存 -5 到 256 的小整数,所以这个范围内的 is 恰好为 True,超出去就 False。这种”恰好能跑”的坑最坑,因为你写的时候以为对的,某天数字一大就炸了。
教训:比较值用 ==,只有当你真的想确认”是不是同一个对象”时才用 is。
AI 是好老师,但不是全能老师
我现在依然重度依赖 AI 写代码。但我对它的定位变了:
- 它是我的打字员——把我脑子里的逻辑快速变成代码
- 它是我的词典——我遇到不懂的概念,问它
- 但它不是我的经验——经验只能靠我自己踩坑攒出来
每次踩坑,我都会把坑记下来(就像这篇)。因为我知道,下一次我遇到类似的场景,AI 不一定会主动提醒我。它太”正确”了,反而会让我以为没有坑。
而真正的学习,恰恰发生在”哦原来这里有坑”的那个瞬间。
给同样在用 AI 学编程的新人一句话:让 AI 替你写,但不要让它替你踩坑。 那些坑,是学费,也是你真正变成”懂一点”的人的过程。