#!/usr/bin/python from contextlib import contextmanager def f_1(n): print 'Call f_1() ...'; return map(lambda x: x*2, n); def f_2(n): print 'Call f_2() ...'; n[0] = 100; @contextmanager def change(n): n = f_1(n); try: yield n; finally: n = f_2(n); l = range(4); # [0, 1, 2, 3] with change(l) as n: print n; # [0, 2, 4, 6] print n; # [100, 2, 4, 6]