Inyeol Lee wrote: > On Jun 15, 3:22 pm, Peter <peter.milli...@gmail.com> wrote: >> I am puzzled by what appears to be a scope issue - obviously I have >> something wrong :-) >> >> Why does this work: >> >> if __name__ == 'main': >> execfile('test-data.py') >> print data >> >> and yet this doesn't (I get "NameError: global name 'data' not >> defined"): >> >> def X(): >> execfile('test-data.py') >> print data >> >> where test-data.py is: >> >> data = [1,2,3,4] >> >> I checked help on execfile and could only find the following >> (mystifying) sentence: >> >> "execfile() cannot be used reliably to modify a function’s locals." >> >> Thanks >> Peter > > This is due to CPython's static optimization of local name lookup. > Dummy 'exec' statement disables this and makes your example work: > > def X(): > exec "None" > execfile('test-data.py') > print data > > --inyeol
You may also consider the following alternative: def f(): ns = {} execfile('test-data.py', ns) print ns["data"] f() This has the advantage that it can be automatically converted to Python 3. Peter -- http://mail.python.org/mailman/listinfo/python-list