+ 1
Why is “to” list not empty on second initialisation? And can we initialise a list in arguments of a function?
def build_list(element, to=[]): to.append(element) return to my_list = build_list(2) print(my_list) my_other_list = build_list(5) print(my_other_list) Output: [2] [2,5]
3 Answers
+ 1
"Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. "
https://docs.python.org/3.9/tutorial/controlflow.html#default-argument-values
>>> def test(a=2, b=[]):
... b.append(a)
... return b
...
>>> test.__defaults__
(2, [])
>>> test(3)
[3]
>>> test.__defaults__
(2, [3])
>>> test(4)
[3, 4]
>>> test.__defaults__
(2, [3, 4])
+ 1
mutable object:
>>> a = 1
>>> id(a)
1677375408
>>> a += 1
>>> id(a)
1677375424
>>> b = []
>>> id(b)
42097000
>>> b += [1]
>>> id(b)
42097000
>>> c = tuple()
>>> id(c)
3866664
>>> c += (1,)
>>> id(c)
8845344
+ 1
Nishant Srinet As fan yu said, default arguments are evaluated only once. In your case, the list object '[]' is created and its reference is stored in the variable 'to' at the time of function creation. Whatever you do now, this function default argument cannot be changed whatsoever. This means that you are appending the integers to the same list object, hence the result. Hopefully this should explain the footprint (int '2') left by the previous function call.