On 12/5/14 4:53 AM, Steven D'Aprano wrote:
Oh, I learned something new: strictly speaking, this is implementation-
dependent and not guaranteed to work in the future!

def func():
     global math
     import math

I don't think this is implementation-dependent. The import statement is an assignment to a name (as are class, def, for, with-as and except-as). Where that name is scoped is the same for all of them, and does not depend on the implementation. The usual behavior of locals and globals happens for all of them:

>>> import math
>>> math
<module 'math' from '/blah/.../math.so'>
>>> def f():
...   print math
...   import math
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
UnboundLocalError: local variable 'math' referenced before assignment


>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> def f():
...   global a
...   for a in range(10):
...     pass
...
>>> f()
>>> a
9

This also means that you can do odd things like:

   for self.foo in range(10):

or:

   for my_list[17] in range(10):

(but please don't!)


--
Ned Batchelder, http://nedbatchelder.com

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to