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