Christoph Haas wrote: > Hi, list... > > I wondered if it's possible to use global (module) variables as default > parameters. A simple working example: > > ---------------------------------------- > #!/usr/bin/python > > globalvar = 123 > > def test(foo=globalvar): > print foo > > test() > ---------------------------------------- > > Running this script prints "123". That's what I expected. > > Now I'm trying the same thing in a module context. A non-working example: > > test.py > ---------------------------------------- > #!/usr/bin/python > > import TestModule > > TestModule.globalvar = 123 > TestModule.def1() > TestModule.def2() > ---------------------------------------- > > TestModule.py > ---------------------------------------- > globalvar = 0 > > def def1(): > print globalvar > > def def2(foo=globalvar): > print foo > ---------------------------------------- > > Running the test.py script prints "123" and "0". So accessing the > globalvar in def1() works. But if I try to use the global variable as a > default parameter in def2() it uses the default "0". What is the > difference between these two? Are there contexts of default parameters?
Yes, and that context is the function definition which is executable code, too. Whatever the variable 'right' in a statement like def f(left=right): ... is bound to when the def is executed will become the default for the 'left' argument. This should become clear when you create more than one function with the same >>> fs = [] >>> for i in range(3): ... def f(i=i): print i ... fs.append(f) ... >>> for f in fs: f() ... 0 1 2 Use a sentinel when you don't want that behaviour: def f(foo=None): if foo is None: foo = globalvar # ... Peter -- http://mail.python.org/mailman/listinfo/python-list