Потому что объект список мутабельный объект rez = []. Ты ожидаешь, что при каждом новом вызове функции у тебя создается пустой список res, а это не так почитай к чему ведет мутабельные типы в качестве значений по умолчанию у параметров функции.
1. В первом случае ты вызываешь первый раз работает как ожидаешь, но но список res уже создан и существует.
2. В втором ты оставляешь без изменения свой дефолтный параметр (список), а он то уже заполнен, и он просто добавляет в него.
3. В третьем случе ты передаешь новый список (новый объект). По этому работает нормально.
Общий кейс для решения таких проблем как то так.
def test(n, rez = None):
if rez is None:
rez = []
for i in range(n):
rez.append(i)
return rez