I just submitted http://python.org/sf/1501934 and assigned it to Neal so it doesn't get forgotten before 2.5 goes out ;) It seems Python 2.5 compiles the following code incorrectly:

>>> g = 1
>>> def f1():
...     g += 1
...
>>> f1()
>>> g
2

It looks like the compiler is not seeing augmented assignment as creating a local name, as this fails properly:

>>> def f2():
...     g += 1
...     g = 5
...
>>> f2()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f2
UnboundLocalError: local variable 'g' referenced before assignment

The dis.dis output confirms this:
>>> dis.dis(f1)
  1           0 LOAD_GLOBAL              0 (g)
              3 LOAD_CONST               1 (1)
              6 INPLACE_ADD        
              7 STORE_GLOBAL             0 (g)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE       

If anyone feels like fixing it and happens to remember where the new compiler does the fast-locals optimization (I recall a few people were working on extra optimizations and all), please do :-) (I can probably look at it before 2.5 if no one else does, though.) It may be a good idea to check for more such cornercases while we're at it (but I couldn't find any in the fast-locals bit.)

--
Thomas Wouters < [EMAIL PROTECTED]>

Hi! I'm a .signature virus! copy me into your .signature file to help me spread!
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to