Keyword arguments - strange behaviour?
duncan.booth at invalid.invalid
Tue Dec 21 11:41:36 CET 2004
> Can anyone explain the behaviour of python when running this script?
>>>> def method(n, bits=):
> ... bits.append(n)
> ... print bits
> [1, 2]
> It's the same in python 1.5, 2.3 and 2.4 so it's not a bug. But I
> expected the variable "bits" to be re-initialised to an empty list as
> each method was called. Whenever I explain optional keyword arguments
> to someone I have usually (wrongly as it turns out) said it is
> equivalent to:
<snipped erroneous comparison>
No, it is closer to:
# Assume you have done this earlier:
def _realmethod(n, bits):
# The def is roughly equivalent to this:
_defaultArgs = (, )
method = new.function(_realmethod.func_code, globals(), 'method',
Each time you re-execute the def you get a new set of default arguments
evaluated, but the result of the evaluation is simply a value passed in to
the function constructor.
The code object is compiled earlier then def creates a new function object
from the code object, the global dictionary, the function name, and the
default arguments (and any closure as well, but its a bit harder to
illustrate that this way).
More information about the Python-list