What is a function parameter =[] for?

BartC bc at freeuk.com
Thu Nov 19 06:41:43 EST 2015


On 19/11/2015 01:59, Chris Angelico wrote:
> On Thu, Nov 19, 2015 at 12:41 PM, BartC <bc at freeuk.com> wrote:
>> On 18/11/2015 23:22, Chris Angelico wrote:
>>> On the contrary, it is certain always to be that exact object.
>>
>> But, not the same value that appears as the default?
>
> Nope. Mutable objects are never guaranteed to retain the same values.
> That's kinda the point.

But, presumably you would expect:

  a = []

to always assign an empty list to a? You don't expect this:

  a = []
  a.append(10)
  b = []

that b now has the same value of a, namely [10]. Fortunately this isn't 
the case.

>> Sorry, I didn't understand any of that.

> If you want to think of function defaults as being values, then yes.
> But they're not. They're objects.

That's not much help to someone who *does* want the default to supply 
the same missing value that they don't want to bother remembering and/or 
writing in the call.

Surely the language is trying to help people not hinder. How many times 
after all is this behaviour actually wanted? It's the equivalent of:

fndefault=[]

def fn(a=fndefault):
     a.append(10)
     return a

where it is known that a and fndefault share the same mutable data. 
(Although I bet some people are still surprised by that!)

>> I suspect those same people (unless they are experts in the murky corners of
>> the language) would expect:
....
>> and not be dependent on fn's entire call history.
>
> Tell me, do you expect these to do the same thing?
>
> x = []
> fn(x)
> fn(x)
> fn(x)
>
> # or
>
> fn([])
> fn([])
> fn([])

No I don't. But I expect the version with the default argument to be 
exactly the same as the last lot of calls, namely for:

fn()
fn()
fn()

to be equivalent to:

temp=[]
fn(temp)
temp=[]
fn(temp)
temp=[]
fn(temp)

> The distinction is exactly the same. If you can understand that the
> first one constructs a single object and uses it three times, then you
> should be able to understand that the function default is also
> constructed once and used every time.

As I said, it's bizarre. It means that for certain types, Python doesn't 
have a default that works per call, but only a default that works once 
per program.

-- 
Bartc



More information about the Python-list mailing list