The list.reverse() method inverts the element order of a list directly in-place.
In-Place Inversion vs. Iteration: list.reverse() modifies the list directly without allocating auxiliary memory, returning None. In contrast, the built-in reversed() function yields elements backwards via an iterator without modifying the source collection. To sort items numerically or alphabetically in descending order, see list.sort(reverse=True).
The reverse() method takes zero arguments and modifies the list in-place:
# Formal syntax of list.reverse()
list_instance.reverse()
| Parameter | Type | Default | Description & Operational Rule |
|---|---|---|---|
| None | Void | N/A | The reverse() method takes zero arguments. |
| Return | None |
N/A | Mutates the list in-place and returns None. |
| Time Complexity | O(N) | N/A | Swaps elements symmetrically using a two-pointer approach from both ends. |
| Auxiliary Space | O(1) | N/A | Operates strictly in-place with zero additional heap memory allocation. |
Calling reverse() flips element positions without reallocating list memory:
# 1. In-place reversal of string items
items = ['a', 'b', 'c', 'd', 'x', 'y', 'z']
print("Before reverse():", items)
# reverse() modifies the list in-place and returns None
ret_val = items.reverse()
print("After reverse(): ", items)
print("Return value: ", ret_val)Terminal Output:
Before reverse(): ['a', 'b', 'c', 'd', 'x', 'y', 'z']
After reverse(): ['z', 'y', 'x', 'd', 'c', 'b', 'a']
Return value: None
Reversing works identically across numeric collections:
# 2. Reversing numeric sequences
numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print("Reversed numbers:", numbers)Terminal Output:
Reversed numbers: [5, 4, 3, 2, 1]
Because reverse() only swaps memory pointers by position, elements do not need to support comparison operators (<, >):
# 3. Reversing mixed heterogeneous data types
# Values are moved by position without comparison
mixed = [1, 'apple', 3.14, True]
mixed.reverse()
print("Reversed mixed list:", mixed)Terminal Output:
Reversed mixed list: [True, 3.14, 'apple', 1]
Reversing and sorting are fundamentally different operations:
# 4. reverse() vs. sort(reverse=True)
data = [4, 2, 9, 1]
# reverse() only inverts current ordering
rev_list = data.copy()
rev_list.reverse()
print("reverse(): ", rev_list)
# sort(reverse=True) compares and arranges highest-to-lowest
sorted_list = data.copy()
sorted_list.sort(reverse=True)
print("sort(reverse=True): ", sorted_list)Terminal Output:
reverse(): [1, 9, 2, 4]
sort(reverse=True): [9, 4, 2, 1]
Python provides three mechanisms to access sequences backwards, each tailored for different memory constraints:
# 5. reverse() vs. Slicing [::-1] vs. reversed()
words = ['Alex', 'Ronald', 'John']
# Method 1: list.reverse() -> in-place, O(1) auxiliary memory
w1 = words.copy()
w1.reverse()
print("w1 (in-place): ", w1)
# Method 2: Slicing [::-1] -> allocates new reversed list
w2 = words[::-1]
print("w2 (new slice list): ", w2)
# Method 3: reversed() iterator -> memory-efficient iterator
iter_rev = reversed(words)
print("w3 (from iterator): ", list(iter_rev))Terminal Output:
w1 (in-place): ['John', 'Ronald', 'Alex']
w2 (new slice list): ['John', 'Ronald', 'Alex']
w3 (from iterator): ['John', 'Ronald', 'Alex']
| Technique | Syntax | Mutates Original? | Memory Complexity | Return Value |
|---|---|---|---|---|
| Method | my_list.reverse() |
Yes (In-Place) | O(1) extra memory | None |
| Slicing | my_list[::-1] |
No | O(N) new list copy | New reversed list |
| Built-in | reversed(my_list) |
No | O(1) lazy iterator | list_reverseiterator |
When applied to multidimensional lists, reverse() only inverts top-level row references:
# 6. Reversing multi-dimensional / 2D lists
matrix = [
[1, 2],
[3, 4],
[5, 6]
]
matrix.reverse()
print("Reversed outer rows:", matrix)Terminal Output:
Reversed outer rows: [[5, 6], [3, 4], [1, 2]]
Validating palindromes symmetrically using two-pointer index comparison without allocating memory:
# 7. Production Recipe: In-Place Palindrome Verifier
def is_palindrome_list(lst: list) -> bool:
"""Checks if a list is identical backwards without creating full copies."""
n = len(lst)
for i in range(n // 2):
if lst[i] != lst[n - 1 - i]:
return False
return True
seq1 = [10, 20, 30, 20, 10]
seq2 = [1, 2, 3, 4, 5]
print("Is seq1 palindrome?", is_palindrome_list(seq1))
print("Is seq2 palindrome?", is_palindrome_list(seq2))Terminal Output:
Is seq1 palindrome? True
Is seq2 palindrome? FalseRecursively reversing both outer containers and inner child lists in deeply nested structures:
# 8. Production Recipe: Recursive Deep Reversal
def deep_reverse(container: list):
"""Recursively reverses both outer list and all nested child lists."""
container.reverse()
for item in container:
if isinstance(item, list):
deep_reverse(item)
grid = [[1, 2], [3, [4, 5]], 6]
deep_reverse(grid)
print("Deep reversed nested list:", grid)Terminal Output:
Deep reversed nested list: [6, [[5, 4], 3], [2, 1]]
Never reassign the return value of reverse() back to the list variable:
# 9. Common traps: Assigning reverse() return value
sample = [1, 2, 3]
# TRAP: Assigning back to variable replaces list with None!
sample = sample.reverse()
print("Assigned sample is now:", sample)Terminal Output:
Assigned sample is now: None
Practice in-place reversals, palindrome verification, and deep reversal in our interactive companion Jupyter Notebook:
Explore interactive code cells, benchmark slicing vs in-place reversals, test palindrome verification, and run self-validating assertions.
View on GitHub Run in Google ColabRun these unit checks directly in Python or your local environment to verify reverse() mechanics:
# 10. Self-verifying unit test suite for list.reverse()
# Test 1: In-place reversal
lst = [10, 20, 30]
assert lst.reverse() is None
assert lst == [30, 20, 10]
# Test 2: Two reversals restore original list
lst.reverse()
assert lst == [10, 20, 30]
# Test 3: Slicing comparison
assert lst[::-1] == [30, 20, 10]
# Test 4: Single element and empty list reversal
single = [42]
single.reverse()
assert single == [42]
empty = []
empty.reverse()
assert empty == []
print("All list.reverse() unit assertions successfully verified!")Terminal Output:
All list.reverse() unit assertions successfully verified!
reverse() modifies the list in-place and always returns None.
Use list slicing new_list = old_list[::-1] or the built-in iterator reversed(old_list).
No. reverse() only inverts the current positional sequence without comparing element values. To sort in descending order, use sort(reverse=True).
Reversing runs in O(N) linear time and O(1) auxiliary memory by swapping pointers symmetrically from both ends inward.
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.