Используем два указателя: один с начала, другой с конца. Меняем элементы местами, пока указатели не встретятся.
def reverse_inplace(arr: list[int]) -> None:
n = len(arr)
left, right = 0, n - 1
while left < right:
arr[left], arr[right] = arr[right], arr[left]
left += 1
right -= 1
a = [1, 2, 3, 4, 5]
reverse_inplace(a)
print(a) # [5, 4, 3, 2, 1]
В Python обмен реализуется одной строкой через распаковку кортежа: a, b = b, a.
Сложность: $O(n)$ по времени, $O(1)$ по памяти. Срез arr[::-1] создал бы новый список ($O(n)$ памяти). А list.reverse() — встроенный метод, делающий то же самое.