Ocurre porque la compilación en Python se realiza ejecutando el código descriptivo.
Si uno dijera
def f(x = {}):
....
sería bastante claro que cada vez querías una nueva matriz.
Pero y si digo:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Aquí supongo que quiero crear cosas en varias listas, y tener un único conjunto global cuando no especifique una lista.
Pero, ¿cómo adivinaría esto el compilador? Entonces, ¿por qué intentarlo? Podríamos confiar en si se nombró o no, y a veces podría ayudar, pero en realidad solo sería adivinar. Al mismo tiempo, hay una buena razón para no intentarlo: consistencia.
Tal como está, Python simplemente ejecuta el código. A la variable list_of_all ya se le asignó un objeto, por lo que ese objeto se pasa por referencia al código que por defecto es x de la misma manera que una llamada a cualquier función obtendría una referencia a un objeto local nombrado aquí.
Si quisiéramos distinguir el caso sin nombre del caso con nombre, eso implicaría que el código en la compilación ejecuta la asignación de una manera significativamente diferente de la que se ejecuta en tiempo de ejecución. Entonces no hacemos el caso especial.