Це відбувається тому, що компіляція в Python виконується шляхом виконання описового коду.
Якщо хтось сказав
def f(x = {}):
....
було б цілком зрозуміло, що ви хотіли кожного разу новий масив.
Але що робити, якщо я скажу:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Тут я б здогадався, що хочу створити матеріали в різні списки і мати єдиний глобальний підсумок, коли я не вказую список.
Але як би компілятор здогадався про це? То навіщо намагатися? Ми можемо розраховувати на те, назвали це чи ні, і це може допомогти іноді, але насправді це просто здогадки. При цьому є вагома причина не пробувати - послідовність.
Як і є, Python просто виконує код. Змінна list_of_all вже призначена об'єкту, так що цей об'єкт передається посиланням на код, який за замовчуванням x таким же чином, що виклик будь-якої функції отримає посилання на локальний об'єкт, названий тут.
Якби ми хотіли відрізнити неназваний від названого випадку, це включало б код при компіляції, що виконує призначення, значно іншим чином, ніж це виконується під час виконання. Тому ми не робимо особливого випадку.