You called my_list.pop() in a loop and at some point Python crashed with IndexError: pop from empty list. The list got drained, the next pop has nothing to take, and Python signals the boundary. This guide covers all 4 safe patterns for popping in production code.

📌 Quick answer: Guard with if my_list: my_list.pop(). For queue patterns, use collections.deque and deque.popleft() + try/except. For long-lived queues, use queue.Queue from the standard library which has explicit get_nowait() / put_nowait().
Pattern 1: Guard with if my_list
The simplest. Truthiness of a list is False when empty.
work = [1, 2, 3]
while work:
item = work.pop()
process(item)
# loop exits cleanly when work becomes []Pattern 2: try / except IndexError
Useful when the pop is deep inside conditional logic and a simple if-guard is awkward.
try:
item = work.pop()
except IndexError:
item = None # or break, or return sentinelPattern 3: Use collections.deque for FIFO queues
list.pop(0) is O(n) and triggers the error on empty just like .pop(). deque.popleft() is O(1).
from collections import deque
q = deque([1, 2, 3])
while q:
item = q.popleft() # O(1), fails on empty
process(item)Pattern 4: queue.Queue for thread-safe drain
For producer-consumer patterns across threads, use queue.Queue with get_nowait() and Empty exception handling.
import queue
q = queue.Queue()
q.put("task1")
try:
item = q.get_nowait()
except queue.Empty:
item = NonePrevention
- Use
while my_list:instead ofwhile True:for loops that drain a list - Switch to collections.deque if you do .pop(0) frequently (O(1) vs O(n))
- Use queue.Queue for cross-thread queues, never bare list.pop
- Test the empty-list case in your unit tests with empty initial state
Related Guides
- List index out of range (full guide)
- String index out of range
- All IndexError fixes
- Python Tutorial hub
Frequently Asked Questions
What does ‘pop from empty list’ mean in Python?
list.pop() removes and returns the last element. When the list is empty there’s nothing to remove, so Python raises IndexError: pop from empty list. The fix is to check the list first or use try/except.
How do I safely pop until the list is empty?
Use ‘while my_list:’ as the loop condition. The list is truthy when non-empty and falsy when empty, so the loop ends naturally when the last item is popped.
What’s the difference between list.pop() and deque.popleft()?
list.pop() removes the LAST element in O(1). list.pop(0) removes the first in O(n) (every other element shifts). collections.deque.popleft() removes the FIRST element in O(1). Use deque for FIFO queues, list for LIFO stacks.
How do I pop with a default value?
Python’s list has no default-pop. Wrap with: item = my_list.pop() if my_list else None. Or use collections.deque and try/except IndexError.
Is list.pop() thread-safe?
It’s atomic for the pop operation but not safe for the check-then-pop pattern (if my_list: my_list.pop()) across threads. Use queue.Queue or collections.deque with explicit locking for thread-safe queues.
