Having Trouble with Scoping Rules

Charles Krug cdkrug at aol.com
Tue Jan 31 00:12:03 EST 2006

On 2006-01-31, Farshid Lashkari <flashkNO at SPAMgmail.com> wrote:
> You need to declare _expensiveObject as global inside your function. 
> Whenever you assign something to a variable that resides in the global 
> scope inside a function, you need to declare it as global at the 
> beginning of the function. So your function should look like this
> def ExpensiveObject():
>      global _expensiveObject
>      if not(_expensiveObject):
>          _expensiveObject = "A VERY Expensive object"
>      return _expensiveObject
> The documentation will no doubtedly explain it better than I have

Not really.  If I'd understood the docs, I wouldn't need to ask here.

Okay, that works in the module where I define the function.  But if I
import the module:

# expensive Object User
import Expensive

print Expensive.ExpensiveObject()

I get the same exception.  That approach most likely isn't going to work
for me, as I need to be able to reuse the costly (to create) object.

Okay THIS seems to be working for me:

# expensive Object Module

_expensiveObject = None
def ExpensiveObject():
        retval = _expensiveObject
    except UnboundLocalError:
        _expensiveObject = "A VERY Expensive object"
        retval = _expensiveObject

    return retval

if __name__ == '__main__':
    print _expensiveObject
    print ExpensiveObject()

Which gives me:

>>> import Expensive
>>> a = Expensive.ExpensiveObject()
>>> b = Expensive.ExpensiveObject()
>>> a == b
>>> a is b

I'll try it with my actual class instance to verify.  Anyone see
anything I'm missing?


More information about the Python-list mailing list