I'm learning the quicksort algorithm, but for some reason, the output of this python implementation is just partially sorted, and I get the 'maximum recursion depth reached' for larger inputs. I've been banging my head against this for the last couple of days and I know it's probably something really stupid, but I can't seem to figure it out, so I'll appreciate any help.

You are always taking the head of the original list, and not the head of the modified list.

Assume at some point you reduced the range to left=5,right=10 - you chose list[0] as the pivot - that can't be good.
As a result, in each iteration where left>0 you ignore the first element in the list, and "miss" it - which can explain the partial sorting

Not exactly an answer to your question, but I believe it's still of most relevance.

Choosing a pivot always on the same position when implementing quicksort is a flaw on the algorithm. One can generate a sequence of numbers that makes your algorithm run in O(n^2) time, and absolute run time probably worse than bubblesort.

In your algorithm, choosing the leftmost item makes the algorithm run in worst-case time when the array is already sorted or nearly sorted.

The choice of the pivot should be performed randomly to avoid this issue.

Choosing a pivot randomly only reduces the likelihood of running in worst-case time since there is nothing to stop the computer from randomly choosing the worst pivot - so to say random selection will avoid the issue is incorrect. Another way to select the pivot to try and avoid having quicksort run in quadratic time is to use the median-of-three approach - take the first, last and middle values, and select the median value.
–
SteveNov 9 '12 at 22:37