Skip to main content

Why list.reverse() Returns None in Python and How to Reverse a List Properly

The list.reverse() method in Python reverses the elements of a list. However, unlike some other list operations, it doesn't return the reversed list but instead returns None. This behavior can be confusing.

This guide explores the reason behind this design choice and demonstrates alternative methods for reversing lists that provide more explicit control.

Understanding In-Place Modification and None Returns

The list.reverse() method is designed to reverse the elements of the list in-place. This means it modifies the original list directly, without creating a new one.

a_list = ['tutorial', 'reference', '.', 'com']
result = a_list.reverse() # Mutates a_list in place
print(result) # Output: None
print(a_list) # Output: ['com', '.', 'reference', 'tutorial']
  • It is Python convention that a method which mutates the original object to return None.
  • This indicates to the developer that the method has performed the requested operation on the object, and they should not expect a new object in return.

Reversing a List Without Mutation Using reversed()

If you want to create a reversed copy of a list without modifying the original, use the reversed() function. This returns an iterator to the reversed list, which you can then convert to a list:

a_list = ['tutorial', 'reference', '.', 'com']
result = list(reversed(a_list))
print(result) # Output: ['com', '.', 'reference', 'tutorial']
print(a_list) # Output: ['tutorial', 'reference', '.', 'com'] (original list is unchanged)
  • The reversed() function returns an iterator object to the reversed list, which is then collected by the list() constructor to a list.
  • The original list is kept unchanged.

It’s also common to reassign the original variable if you no longer need the original order.

Reversing a List Without Mutation Using List Slicing

List slicing provides a more concise way to reverse a list without modifying the original:

a_list = ['tutorial', 'reference', '.', 'com']
result = a_list[::-1]
print(result) # Output: ['com', '.', 'reference', 'tutorial']
print(a_list) # Output: ['tutorial', 'reference', '.', 'com'] (original list is unchanged)
  • [::-1] creates a reversed copy of the list without affecting the original one.
  • To perform an in-place reversal using this technique, you can assign the slice directly to the list:
a_list = ['tutorial', 'reference', '.', 'com']
a_list = a_list[::-1]
print(a_list) # Output: ['com', '.', 'reference', 'tutorial']

Checking Return Types in Your IDE

Most modern IDEs (Integrated Development Environments) display method signatures, including return types. Pay attention to these, as they quickly indicate whether a method modifies an object in-place or returns a new object.

  • If a method returns None, it typically modifies the object in place.
  • If a method returns the modified list or another data type, it typically means that the method does not modify the object in place.

Key Takeaway

  • Avoid assigning the result of list.reverse() to a variable.
  • Methods that modify objects in-place generally return None in Python.
  • Use reversed() or list slicing if you need to keep the original list intact.