Yes that is correct. The default value gets created when the function is interpreted ("compiled").
No. The default value gets "created" (the expression is evaluated and stored) when the def statement is executed. Take the following example:
In [1]: def foo():
...: def append_five(l=[]):
...: l.append(5)
...: return l
...: return append_five
...:
In [2]: a = foo()
In [3]: b = foo()
In [4]: a()
Out[4]: [5]
In [5]: b()
Out[5]: [5]
In [6]: _4 is _5
Out[6]: False
We only wrote one function definition, but multiple lists are created. (They are created when the "def append_five" definition executes, during the execution of foo.)