The problem seemed to be because I was rebinding result inside executor. Can someone explain why it works below but not in the first one?
Also why is it if I set tmp as a global and don't pass it as a paremeter to the various functions as per the OP that I get an "UnboundLocalError: local variable 'tmp' referenced before assignment"? def execute_once(fn): print "in execute_once" result = {} def executor(*args, **kwargs): if fn not in result: result[fn] = fn(*args, **kwargs) return result[fn] return executor @execute_once def execute(tmp): print "in execute" tmp = tmp+1 return tmp def func1(tmp): return execute(tmp) def func2(tmp): return execute(tmp) tmp = 0 print 'init tmp:', tmp tmp = func1(tmp) print 'ran func1 tmp:', tmp tmp = func2(tmp) print 'ran func2 tmp:', tmp tmp = func1(tmp) print 'ran func1 tmp:', tmp OUTPUT: in execute_once init tmp: 0 in execute ran func1 tmp: 1 ran func2 tmp: 1 ran func1 tmp: 1 -- http://mail.python.org/mailman/listinfo/python-list