[Zope] Persistent variable in Python Script? Is this a feature or a bug?

Max M maxm@mxm.dk
Tue, 09 Apr 2002 11:24:01 +0200


iap@y2fun.com wrote:

>Given a Python Script A which only returns an array
>========
>return ('a')
>========
>
>Then call A in another Python Script B with parameter list: b=[]
>
>========
>b.append(container.A())
>return b
>========
>
>Then request B in browser. Guess what happened?
>['a']
>correct!
>But what if you "reload" B again and again?
>You will get
>['a','a','a',........]
>

 From the docs:

7.5 Function definitions

Default parameter values are evaluated when the function definition is 
executed. This means that the expression is evaluated once, when the 
function is defined, and that that same ``pre-computed'' value is used 
for each call. This is especially important to understand when a default 
parameter is a mutable object, such as a list or a dictionary: if the 
function modifies the object (e.g. by appending an item to a list), the 
default value is in effect modified. This is generally not what was 
intended. A way around this is to use None as the default, and 
explicitly test for it in the body of the function, e.g.:


def whats_on_the_telly(penguin=None):
    if penguin is None:
        penguin = []
    penguin.append("property of the zoo")
    return penguin

regards Max M