The list.clear() method removes all items from an existing list in-place.
In-Place Reset vs. Reassignment: Calling list.clear() resets the list length to 0 while preserving the original memory object via id(), ensuring all aliases see the update. In contrast, reassignment (lst = []) merely binds the variable to a new object. To remove specific items by value or index, see list.remove() and list.pop(). For list duplication, see list.copy().
The clear() method takes zero arguments and modifies the list in-place:
# Formal syntax of list.clear()
list_instance.clear()
| Parameter | Type | Default | Description & Operational Rule |
|---|---|---|---|
| None | Void | N/A | The clear() method accepts zero arguments. |
| Return | None |
N/A | Always returns None. |
| Time Complexity | O(N) | N/A | Linear time to decrement element reference counts and deallocate memory slots. |
| Auxiliary Space | O(1) | N/A | Modifies existing list buffer in-place with zero extra memory. |
Calling clear() removes all elements while keeping the list object active in memory:
# 1. Removing all items from a list in-place
users = ["Alex", "Ronald", "John", "Ravi"]
print("Initial list: ", users)
# clear() empties the list in-place and returns None
result = users.clear()
print("After clear():", users)
print("Return value: ", result)
print("List length: ", len(users))Terminal Output:
Initial list: ['Alex', 'Ronald', 'John', 'Ravi']
After clear(): []
Return value: None
List length: 0
Understanding reference semantics is vital when working with shared variables or function arguments:
# 2. clear() vs. Reassignment (= []) with Shared References
# Scenario A: Using clear() on shared references
ref_a = [10, 20, 30]
alias_a = ref_a
ref_a.clear() # Empties the existing list object in memory
print("ref_a: ", ref_a)
print("alias_a: ", alias_a) # Also empty because both share the same ID
# Scenario B: Reassigning to []
ref_b = [10, 20, 30]
alias_b = ref_b
ref_b = [] # Rebinds ref_b to a newly allocated empty list
print("ref_b: ", ref_b)
print("alias_b: ", alias_b) # Still retains the original list elements!Terminal Output:
ref_a: []
alias_a: []
ref_b: []
alias_b: [10, 20, 30]
The del statement provides two distinct deletion modes:
# 3. clear() vs. del list[:] vs. del list
items = ["apple", "banana", "cherry"]
# 1. del list[:] (slice deletion: equivalent to clear())
del items[:]
print("After del items[:]:", items)
# 2. del list (deletes the variable name from scope)
del items
try:
print(items)
except NameError as err:
print("NameError caught: ", err)Terminal Output:
After del items[:]: []
NameError caught: name 'items' is not defined
| Technique | Syntax | Retains Variable Name? | Shared Reference Impact |
|---|---|---|---|
| Method | my_list.clear() |
Yes (list empty) | All aliases updated to empty list |
| Slice Deletion | del my_list[:] |
Yes (list empty) | All aliases updated to empty list |
| Rebinding | my_list = [] |
Yes (new object) | Only rebinds variable; aliases untouched |
| Statement | del my_list |
No (raises NameError) | Deletes variable name; underlying list persists if aliased |
When applied to nested lists, calling clear() on an inner list empties only that row:
# 4. Using clear() with multi-dimensional / 2D lists
matrix = [
[1, 2],
[3, 4],
[5, 6]
]
# Clearing only the first row
matrix[0].clear()
print("After row 0 clear:", matrix)
# Clearing all rows while keeping row structure
for row in matrix:
row.clear()
print("After all rows clear:", matrix)Terminal Output:
After row 0 clear: [[], [3, 4], [5, 6]]
After all rows clear: [[], [], []]
In CPython, clear() releases references to all stored items, allowing garbage collection to reclaim memory:
# 5. Memory footprint before and after clear()
import sys
large_list = list(range(100_000))
print("Memory before clear:", sys.getsizeof(large_list), "bytes")
large_list.clear()
print("Memory after clear: ", sys.getsizeof(large_list), "bytes")
print("Remaining elements: ", len(large_list))Terminal Output:
Memory before clear: 800056 bytes
Memory after clear: 56 bytes
Remaining elements: 0
Creating a reusable stream buffer that avoids repeated list container allocations in worker loops:
# 6. Production Recipe: Reusable In-Memory Stream Buffer
class StreamBuffer:
def __init__(self, capacity=5):
self._buffer = []
self._capacity = capacity
def push(self, item):
self._buffer.append(item)
if len(self._buffer) >= self._capacity:
self.flush()
def flush(self):
if self._buffer:
print("Flushing batch to store:", list(self._buffer))
# clear() empties buffer in-place without reallocating
self._buffer.clear()
buf = StreamBuffer(capacity=3)
for packet in ["pkt_1", "pkt_2", "pkt_3", "pkt_4"]:
buf.push(packet)
buf.flush()Terminal Output:
Flushing batch to store: ['pkt_1', 'pkt_2', 'pkt_3']
Flushing batch to store: ['pkt_4']Safely resetting caller state across function boundaries:
# 7. Production Recipe: Resetting Caller State via Functions
def reset_session_state(active_connections: list):
"""Guarantees the caller's shared connection pool is emptied in-place."""
active_connections.clear()
session_pool = ["conn_101", "conn_102", "conn_103"]
reset_session_state(session_pool)
print("Session pool reset:", session_pool)Terminal Output:
Session pool reset: []
Never assign the return value of clear() back to the variable:
# 8. Common traps: Assigning clear() return value
data = [1, 2, 3]
# TRAP: data.clear() returns None, so assigning destroys the list variable!
data = data.clear()
print("Assigned data is now:", data)Terminal Output:
Assigned data is now: None
Practice in-place list clearing, reference semantics, and buffer management in our interactive companion Jupyter Notebook:
Explore interactive code cells, benchmark memory deallocation with sys.getsizeof(), test alias behavior, and run self-validating assertions.
Run these unit checks directly in Python or your local environment to verify clear() mechanics:
# 9. Self-verifying unit test suite for list.clear()
# Test 1: In-place clearing and return None
lst = ["a", "b", "c"]
ret = lst.clear()
assert ret is None
assert lst == []
assert len(lst) == 0
# Test 2: Shared reference visibility
shared_orig = [1, 2]
shared_ref = shared_orig
shared_orig.clear()
assert shared_ref == []
assert shared_ref is shared_orig
# Test 3: Slicing equivalence
slice_lst = [10, 20]
del slice_lst[:]
assert slice_lst == []
# Test 4: Clearing empty list safely
empty = []
empty.clear()
assert empty == []
print("All list.clear() unit assertions successfully verified!")Terminal Output:
All list.clear() unit assertions successfully verified!
clear() modifies the list in-place and always returns None.
clear() empties the existing object in-place so all references see the change. lst = [] rebinds only the local variable to a new empty list.
Yes, both perform identical operations in CPython, but lst.clear() is preferred for readability.
Yes. CPython decrements reference counts of all stored elements and shrinks the internal list allocation buffer.
Author & Instructor at plus2net
I write and maintain practical tutorials on Python, PHP, SQL, JavaScript, HTML, jQuery, and web development at plus2net. The tutorials focus on clear explanations, working examples, and code that readers can test and adapt while learning.