On Mon, Sep 01, 2014 at 06:46:41AM -0700, Albert-Jan Roskam wrote: > >> def __init__(self): > > global some_nonbuiltin > > import some_nonbuiltin > > Ahh with 'global', thank you! It never crossed my mind that this > should be used in this case. Within functions, 'global' is only > required when the global variable is going to be modified.
No! Absolutely not! The "global" keyword is needed when the global *name* is going to be re-bound to a different object, it has nothing to do with modifying objects. Let's see how we might "modify a variable": py> mylist = [] py> def spam(): ... mylist.append(42) # modifies the mylist object ... py> spam() py> spam() py> print mylist [42, 42] Calling spam() doesn't change what the name "mylist" refers to, it's still the same list, but the list does get changed. If you re-bind the name, by default Python treats it as a local variable: py> def eggs(): ... mylist = ["something", "else"] ... py> eggs() py> print mylist [42, 42] You need the global keyword to make eggs() consider "mylist" to be global rather than local: py> def eggs(): # take two ... global mylist ... mylist = ["something", "else"] ... py> eggs() py> print mylist ['something', 'else'] The import statement performs a name binding: it creates a variable with the same name as the module (or the name given by "as"). py> math # name doesn't exist yet Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'math' is not defined py> import math py> math # now the name exists, same as if we said "math = ..." <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'> So what happens if you put an import inside a function? It creates a variable with the name of the module. Since it is inside a function, it is a *local* variable, which makes it invisible to anything outside of that module: py> def cheese(): ... import string ... py> cheese() py> string Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'string' is not defined To make it a global name, you need the global keyword: py> def cheese(): # take two ... global string ... import string ... py> cheese() py> string <module 'string' from '/usr/local/lib/python2.7/string.pyc'> -- Steven _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor