On 2007-10-29, Steven Bethard <[EMAIL PROTECTED]> wrote: > Hrvoje Niksic wrote: >> Tommy Nordgren <[EMAIL PROTECTED]> writes: >> >>> Given the following: >>> def outer(arg) >>> avar = '' >>> def inner1(arg2) >>> # How can I set 'avar' here ? >> >> I don't think you can, until Python 3: >> http://www.python.org/dev/peps/pep-3104/ > > But it definitely does work in Python 3 if you use 'nonlocal':: > > Python 3.0a1+ (py3k:58681, Oct 26 2007, 19:44:30) [MSC v.1310 32 bit > (Intel)] on win32 > Type "help", "copyright", "credits" or "license" for more > information. > >>> def f(): > ... x = 1 > ... def g(): > ... nonlocal x > ... x = 2 > ... print(x) > ... g() > ... print(x) > ... > >>> f() > 1 > 2 > > That said, I'd like to see the reason you think you want to do > this.
It's allows a standard programming idiom which provides a primitive form of object oriented programming using closures to represent state. def account(opening_balance): balance = opening_balance def get_balance(): nonlocal balance return balance def post_transaction(x): nonlocal balance balance += x return balance, post_transaction fred_balance, fred_post = account(1500) joe_balance, joe_post = account(12) fred_post(20) joe_post(-10) fred_balance() 1520 joe_balance() 2 Python classes will of course nearly always win, though the idiom looks like it might be faster (I don't have Python 3000 to try it out). -- Neil Cerutti It isn't pollution that is hurting the environment; it's the impurities in our air and water that are doing it. --Dan Quayle -- http://mail.python.org/mailman/listinfo/python-list