It happens because compilation in Python is performed by executing the descriptive code.
If one said
def f(x = {}):
....
it would be pretty clear that you wanted a new array each time.
But what if I say:
list_of_all = {}
def create(stuff, x = list_of_all):
...
Here I would guess I want to create stuff into various lists, and have a single global catch-all when I do not specify a list.
But how would the compiler guess this? So why try? We could rely on whether this was named or not, and it might help sometimes, but really it would just be guessing. At the same time, there is a good reason not to try -- consistency.
As it is, Python just executes the code. The variable list_of_all is assigned an object already, so that object is passed by reference into the code that defaults x in the same way that a call to any function would get a reference to a local object named here.
If we wanted to distinguish the unnamed from the named case, that would involve the code at compilation executing assignment in a significantly different way than it is executed at run-time. So we do not make the special case.