Here's a function. My intent is to use keyword argument defaults to make the dictionary an empty dictionary if it is not supplied.
>>> def f( i, d={}, x=3 ) : ... d[i] = i*i ... x += i ... return x, d ... >>> f( 2 ) (5, {2: 4})
But when I next call f, I get:
>>> f(3) (6, {2: 4, 3: 9})
It looks like the keyword argument d at the second call does not point to an empty dictionary, but rather to the dictionary as it was left at the end of the preceding call. The number x is reset to three on each call.
Now I can work around this, but I would like your help understanding this. I believed that keyword arguments are in the local scope of the function, and would be deleted once the function returned. (Excuse and correct my terminology if I am being imprecise.)
So the local value pointed to by the name d should be deleted, and on the next call, if I don't supply the keyword argument d, then d should be set to the default {}
. But as you can see, d is being set to the dictionary that d pointed to in the preceding call.
What is going on?
Is the literal {}
in the def line in the enclosing scope?
This behavior is seen in 2.5, 2.6 and 3.1.
In Python to create an empty dictionary, we can assign no elements in curly brackets {}. We can also create an empty dictionary by using the dict() method it is a built-in function in Python and takes no arguments.
It's dangerous only if your function will modify the argument. If you modify a default argument, it will persist until the next call, so your "empty" dict will start to contain values on calls other than the first one. Yes, using None is both safe and conventional in such cases.
default defaults to None . Return the value for key if key is in the dictionary, else default . If default is not given, it defaults to None , so that this method never raises a KeyError . In the above code, you use .
Answer: d) is a bad idea because the default [] will accumulate data and the default [] will change with subsequent calls.
>>> def f(i, d=None, x=3): ... if not d: ... d={} ... d[i] = i*i ... x += i ... return x,d ... >>> f(2) (5, {2: 4}) >>> f(3) (6, {3: 9}) >>>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With