I was reading the python tutorial from Python Documentation Release 2.7.10 and I came across something like this.
Code
def fun1(a,L=[]):
L.append(a)
return L
print fun1(1)
print fun1(2)
print fun1(3)
def fun2(a,L = None):
if L is None:
L=[]
L.append(a)
return L
print fun2(1)
print fun2(2)
print fun2(3)
Output
[1]
[1, 2]
[1, 2, 3]
[1]
[2]
[3]
Process finished with exit code 0
If the L=[]
in the first function fun1()
is getting called only once , the output of fun1()
is fine. But then why L=None
is getting called every time in fun2()
.
When you define a function the values of the default arguments get evaluated, but the body of the function only get compiled. You can examine the result of the function definition via attributes. Theres a __defaults__
attribute containing the defaults and __code__
attribute containing the body (so these are created when the function is defined).
What's happening in the second example is that None
do get evaluated at definition (it evaluates to None
duh!), but the code that conditionally assigns []
to L
only gets compiled and is run each time (the condition passes).