Modifying the default argument of function

2014-01-21 Thread

Hi everybody,

A friend of mine asked me a question about the following code:

[code]
def f(x=[2,3]):
x.append(1)
return x

print(f())
print(f())
print(f())
[/code]

The results are [2, 3, 1], [2, 3, 1, 1] and [2, 3, 1, 1, 1].

The function acts as if there were a global variable x, but the call of 
x results in an error (undefined variable). I don't understand why the 
successive calls of f() don't return the same value: indeed, I thought 
that [2,3] was the default argument of the function f, thus I expected 
the three calls of f() to be exactly equivalent.


I'm don't know much about python, does anybody have a simple explanation 
please?


--
Mû

---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce 
que la protection avast! Antivirus est active.
http://www.avast.com

--
https://mail.python.org/mailman/listinfo/python-list


Re: Modifying the default argument of function

2014-01-21 Thread

Le 21/01/2014 20:19, Chris Angelico a écrit :

On Wed, Jan 22, 2014 at 6:11 AM, Mû  wrote:

The function acts as if there were a global variable x, but the call of x
results in an error (undefined variable). I don't understand why the
successive calls of f() don't return the same value: indeed, I thought that
[2,3] was the default argument of the function f, thus I expected the three
calls of f() to be exactly equivalent.


In a sense, there is. The default for the argument is simply an object
like any other, and it's stored in one place.

For cases where you want a mutable default that is "reset" every time,
the most common idiom is this:

def f(x=None):
 if x is None: x=[2,3]
 x.append(1)
 return x

That will create a new list every time, with the same initial contents.

ChrisA



Thank you, thanks everybody,

These were clear and quick answers to my problem. I did not think of 
this possibility: the default argument is created once, but accessible 
only by the function, therefore is not a global variable, whereas it 
looks like if it were at first glance.


--
Mû


---
Ce courrier électronique ne contient aucun virus ou logiciel malveillant parce 
que la protection avast! Antivirus est active.
http://www.avast.com

--
https://mail.python.org/mailman/listinfo/python-list