On 11/02/2014 03:01 PM, Alex Kleider wrote:
I'm puzzled by the following behaviour:

The following works as I expect:

alex@x301:~/Python$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
code = """\
... s1 = 'first'
... s2 = 'second'
... """
exec(code)
s1
'first'
s2
'second'


..the following script also behaves as I expect:
alex@x301:~/Python$ cat test.py
#!/usr/bin/env python3
"""
Testing use of exec().
"""
code = """\
s1 = 'first'
s2 = 'second'
"""
exec(code)
print(s1)
print(s2)
alex@x301:~/Python$ ./test.py
first
second

... but this one doesn't:
alex@x301:~/Python$ cat t1.py
#!/usr/bin/env python3
"""
Testing use of exec().
"""
code = """\
s1 = 'first'
s2 = 'second'
"""

def main():
     exec(code)
     print(s1)

if __name__ == "__main__":
     main()
alex@x301:~/Python$ ./t1.py
Traceback (most recent call last):
   File "./t1.py", line 15, in <module>
     main()
   File "./t1.py", line 12, in main
     print(s1)
NameError: name 's1' is not defined

Any light that can be shed onto this would be appreciated.
Alex


I'll assume CPython.  Other implementations may vary.

Sure. Inside a function (whether in interpreter or in a script, no difference), there are a fixed set of local variables, that the compiler has identified. You can't add more by any means, whether by using locals(), or exec(), or other trickery.

Those variables are referred to by number, so it's very much like slots in a class. There is no name lookup at run time for function-locals, which saves time and probably space.

You could probably make something work using the global statement, but I don't know whether exec() would even notice such a thing. You also could pass custom local and global namespaces, and fake something that way.

Real question is what you're trying to do. eval() and exec() are to be avoided if possible, so the solutions are not necessarily the easiest.

--
DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to