Your Python example wouldn't work. eval is still scoped lexically. You'd need to get current stack frame, get locals from the previous frame and only eval within these locals. That's what TCL `upvar` does, BTW.
Macros let you avoid this kind of problems when meta-programming (but then they bring their own problems: hygiene, for example).