10 Python Mistakes You Don’t Know You’re Making
These 10 subtle Python mistakes can creep into your codebase — learn to spot and fix them before they become bugs.

Even experienced devs slip up.
10 Python Mistakes You Don’t Know You’re Making
Whether you’re a seasoned developer or just dipping your toes into Python, there are pitfalls that sneak past even the most attentive coders. Some of these mistakes don’t throw errors. They quietly degrade performance, cause bugs down the line, or simply make your code less Pythonic.
Here are 10 common Python mistakes you might not know you’re making — and how to fix them.
1. Using Mutable Default Arguments
def add_item(item, items=[]):
items.append(item)
return items
The Problem: The default list items=[]
is shared across all function calls. This leads to unexpected behavior.
Fix it:
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
2. Confusing is
with ==
a = [1, 2]
b = [1, 2]
print(a is b) # False
print(a == b) # True
The Problem: is
checks identity (memory location), not value equality. Using it incorrectly can cause subtle logic bugs.
Use ==
when comparing values, and reserve is
for identity checks (like x is None
).
3. Overusing List Comprehensions
# Looks slick but...
[print(x) for x in range(10)]
The Problem: List comprehensions are meant to create lists, not for side effects like printing. This creates an unnecessary list of None
.
Fix it:
for x in range(10):
print(x)
Readable > Clever. Every time.
4. Not Understanding Python’s Loop-Else
for item in items:
if item == target:
break
else:
print("Not found")
Wait… what’s that else
doing on a for
loop?
The Gotcha: The else
block only executes if the loop wasn’t terminated by a break
. It’s one of Python’s lesser-known features—and easily missed.
5. Catching Too Broad Exceptions
try:
risky_operation()
except:
print("Something went wrong.")
The Problem: Catching everything with a bare except
can mask bugs like KeyboardInterrupt
or SystemExit
.
Fix it:
try:
risky_operation()
except ValueError as e:
print(f"Value error: {e}")
Always be specific. Your future self (and your debugger) will thank you.
6. Modifying a List While Iterating Over It
items = [1, 2, 3, 4]
for item in items:
if item % 2 == 0:
items.remove(item)
Result? Unexpected behavior. Some items get skipped.
Solution: Use a copy.
for item in items[:]:
if item % 2 == 0:
items.remove(item)
Or better yet, use a list comprehension for clean filtering.
7. Not Utilizing Python’s Standard Library
You’d be surprised how many developers write their own implementations of common utilities — like counting elements or reading files line by line.
Better way:
from collections import Counter
counts = Counter(['a', 'b', 'a', 'c'])
Before reinventing the wheel, check the docs. Python’s standard library is rich, elegant, and battle-tested.
8. Misusing lambda
for Complex Logic
sorted(data, key=lambda x: (x.price, x.quantity, -x.timestamp))
The Problem: It works, but if the logic gets complex, lambda
quickly becomes unreadable.
Solution: Define a regular function:
def sort_key(item):
return (item.price, item.quantity, -item.timestamp)
sorted(data, key=sort_key)
Readable code wins in the long run.
9. Neglecting Virtual Environments
We’ve all been there — accidentally installing a package globally and breaking another project.
Use:
python -m venv venv
source venv/bin/activate # Unix/macOS
venv\Scripts\activate # Windows
It keeps dependencies isolated and your projects safe from version conflicts.
10. Ignoring Type Hints (Even When You’re Not Using a Linter)
def process(data):
...
Sure, it runs. But what is data
? A string? A list? A dictionary?
Use type hints:
def process(data: dict[str, int]) -> None:
...
Even without static type checking tools like mypy
, type hints serve as valuable inline documentation—and future-proof your codebase.
Final Thoughts
Python is a beautiful, expressive language — but it comes with quirks that can catch even experienced devs off guard. The good news? Once you spot these common pitfalls, they’re easy to avoid.
Write clean, thoughtful code. Embrace Pythonic practices. And above all — keep learning.
If you’ve been making any of these mistakes, don’t sweat it. We all do. The goal is progress, not perfection.
Enjoyed this post? Leave a 💬 or 🧡 if it helped you, and follow for more practical Python tips, dev wisdom, and clean code inspiration.
