大家好,我是你们的编程学习伙伴。
最近我收到很多私信,说学 Python 学了大半年,写代码还是磕磕绊绊。聊天之后我发现,绝大部分人都在同一个地方跌倒过。
今天这篇文章,整理了新手学 Python 最常见的 5 个坑。如果你正在学,建议收藏。如果你已经学了一段时间,看看你踩过几个。
第1坑:从不看报错信息
这是我见过最多的一个问题。
很多人代码报错了,第一反应不是看报错内容,而是直接截图发群里:「大佬帮我看看」。
Python 的报错信息其实是程序员最好的老师。它明明白白告诉你:哪一行出错了,错误类型是什么,甚至还给你提示可能的原因。
举个例子:
Traceback (most recent call last): File "test.py", line 3, in <module> print(name) NameError: name 'name' is not defined
这里清清楚楚写着:第 3 行,变量 name 没定义。你只需要检查:是不是拼写错了?是不是忘了赋值?
正确做法:遇到报错,先逐行读报错信息,90% 的问题都能自己解决。只有剩下那 10%,再去问别人。这样你的排查能力会突飞猛进。
第2坑:循环里修改列表
这是一个几乎所有 Python 初学者都会犯的错误,而且非常隐蔽。
# 想删除列表中所有偶数 numbers = [1, 2, 3, 4, 5, 6] for num in numbers: if num % 2 == 0: numbers.remove(num) print(numbers) # [1, 3, 5, 6] ← 6 怎么还在?
为什么 6 没被删掉?因为当你删除元素时,列表的索引会变动,循环会跳过一些元素。
这个 bug 的可怕之处在于:它不会报错,程序正常运行,但结果不对。
正确做法:
# 方法1:用列表推导式 numbers = [1, 2, 3, 4, 5, 6] numbers = [n for n in numbers if n % 2 != 0] # 方法2:遍历副本 for num in numbers[:]: if num % 2 == 0: numbers.remove(num)
第3坑:可变对象做默认参数
先看一段代码,猜猜输出什么:
def add_item(item, my_list=[]): my_list.append(item) return my_list print(add_item(1)) # [1] print(add_item(2)) # [1, 2] ← 预期是 [2]! print(add_item(3)) # [1, 2, 3] ← 预期是 [3]!
为什么会这样?
Python 函数的默认参数只在函数定义时计算一次,而不是每次调用都重新计算。所以 my_list=[] 创建的列表是同一个对象,所有调用共享它。
正确做法:
def add_item(item, my_list=None): if my_list is None: my_list = [] my_list.append(item) return my_list
用 None 做默认值,然后在函数内部判断并创建新列表。
第4坑:分不清 == 和 is
== 比较的是值,is 比较的是对象身份(是不是同一个对象)。
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True (值相同) print(a is b) # False (不同对象) a = 256 b = 256 print(a is b) # True ← 小整数被缓存了 a = 257 b = 257 print(a is b) # False ← 超出缓存范围
最坑的地方:Python 对小整数(-5 到 256)做了缓存,所以 is 在小整数上碰巧返回 True。但这不是语言保证的行为。
记住一条规则:与 None 比较用 is,其他所有情况用 ==。永远不会错。
第5坑:从不写测试
很多新手认为:「测试是高级工程师的事,我一个初学者写什么测试?」
恰恰相反。正因为你是新手,更容易写出 bug,所以你才更需要测试。
不需要一上来就用 pytest、unittest 这些框架。你只需要做一件事:
# 写完一个函数后,加几行 assert 验证 def add(a, b): return a + b # 手动测试 assert add(1, 2) == 3 assert add(-1, 1) == 0 assert add(0, 0) == 0 print("全部通过!")
这花不了 30 秒,但能帮你避免 80% 的低级错误。
养成习惯后,你会发现自己写代码的信心和效率都大幅提升。因为你写的每一行代码,都有测试帮你背书。
总结
这 5 个坑,不是我编的,是从数百个新手的真实代码里总结出来的:
- 不看报错信息 → 学会读报错,自己能解决 90% 的问题
- 分不清 == 和 is → 只有 None 用 is
编程学习没有捷径,但可以少走弯路。把这 5 个坑记住,你已经比 90% 的新手强了。
你在学 Python 的过程中踩过哪些坑?欢迎在留言区分享,一起避坑。