George Sakkis wrote: > Gary Wessle wrote: >> Hi >> >> the second argument in the functions below suppose to retain its value >> between function calls, the first does, the second does not and I >> would like to know why it doesn't? and how to make it so it does? >> >> thanks >> >> # it does >> def f(a, L=[]): >> L.append(a) >> return L >> print f('a') >> print f('b') >> >> >> # it does not >> def f(a, b=1): >> b = a + b >> return b >> print f(1) >> print f(2) > > It's a FAQ: > http://www.python.org/doc/faq/general/#why-are-default-values-shared-between-objects. > > Whenever you want to control one or more objects beyond the lifetime of > a single function call, your first thought should be to use a class to > couple behaviour with state: > > class SomeFancyClassName(object): > def __init__(self, b=1): > self.b = b > def f(self, a): > self.b += a > return self.b > > x = SomeFancyClassName() > print x.f(1) > print x.f(2)
If you make the class callable you can match the original syntax: In [40]: class F(object): ....: b=1 ....: def __call__(self, a): ....: F.b += a ....: return F.b ....: ....: In [41]: f=F() In [42]: f(1) Out[42]: 2 In [43]: f(2) Out[43]: 4 Alternately you can use an attribute of the function to save the state: In [35]: def f(a): ....: f.b += a ....: return f.b ....: In [36]: f.b=1 In [37]: f(1) Out[37]: 2 In [38]: f(2) Out[38]: 4 Kent -- http://mail.python.org/mailman/listinfo/python-list