0

I need explanation for this output

def f(a,l=[]): l.append(a) return l print(f(1),f(3)) It prints [1,3] [1,3] But why? l is a local variable , every time when function calls l=[], then output should be [1][3] Explain please

30th Jul 2020, 3:32 PM
5152Vignesh .A
5152Vignesh .A - avatar
3 Answers
+ 5
The biggest point here is that f has only 1 default list for parameter l so mutations from one call carry into subsequent calls. The default value for l isn't a normal local variable. It is more like a global variable that has a local scope. Some languages like c and c++ support static local variables which have a similar effect. print(f(1),f(3)) breaks down into this sequence: 1. f(1) is called causing default list value for parameter l to become [1]. 2. f(3) is called causing default list value for parameter l to become [1, 3]. 3. print prints the result from f(1) which is the default list value for parameter l. Since that value is now [1, 3], that gets printed. 4. print prints the result from f(3) which is the default value for parameter l. Since that value is still [1, 3], that gets printed. You can still get the effect you expected by ensuring l gets assigned a different list. def f(a,l=[]): l.append(a) return l print(f(1, []),f(3, [])) # [] can be mutated independently from the other [] here. That outputs: [1] [3] def f(a, l=None): if l is None: l = [] # create new instance of list... don't just reuse the old one. l.append(a) return l print(f(1),f(3)) That outputs: [1] [3]
30th Jul 2020, 3:45 PM
Josh Greig
Josh Greig - avatar
0
What does the following code output? x = [[0]*3]*3 x[0][0] = 1 print(x)
20th Jul 2024, 9:22 AM
mohan
0
What does the following code output? x = [[0]*3]*3 x[0][0] = 1 print(x)
20th Jul 2024, 9:22 AM
mohan