Isso acontece porque a compilação no Python é executada executando o código descritivo.
Se alguém dissesse
def f(x = {}):
....
seria bem claro que você queria uma nova matriz a cada vez.
Mas e se eu disser:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Aqui, acho que quero criar coisas em várias listas e ter um único exemplo global quando não especificar uma lista.
Mas como o compilador adivinharia isso? Então, por que tentar? Poderíamos confiar se esse nome foi ou não, e isso pode ajudar às vezes, mas na verdade seria apenas um palpite. Ao mesmo tempo, há uma boa razão para não tentar - consistência.
Como é, Python apenas executa o código. A variável list_of_all já está atribuída a um objeto, de modo que o objeto é passado por referência no código que padroniza x da mesma maneira que uma chamada para qualquer função obteria uma referência a um objeto local chamado aqui.
Se quiséssemos distinguir o caso não nomeado do caso nomeado, isso envolveria o código na compilação executando a atribuição de uma maneira significativamente diferente da executada no tempo de execução. Portanto, não fazemos o caso especial.