locals3 = {'d': {(1): 'x', (2): 'y', (3): 'z'}, 'test': 3}
globals3 = dict(list(globals().items()) + [('d', {(1): 'a', (2): 'b', (3): 'c'}),
    ('test', 2)])
exec("""def f():
    new = d.copy()
    new.pop(test)
    return new
new = f()""", globals3, locals3)
понимание словаря python в exec использует глобальные переменные вместо локальных