Это легко объясняется:
Итак:
def x(a=0, b=[], c=[], d=0):
a = a + 1
b = b + [1]
c.append(1)
print a, b, c
a
не изменяется - каждый вызов назначения создает новый объект int - печатается новый объект b
не изменяется - новый массив создается из значения по умолчанию и печатается c
изменения - операция выполняется на одном и том же объекте - и печатается