+ 3
is it because of the reference?
def cm(): return [ lambda x: i * x for i in range(3)] for m in cm(): print(m(1), end='') output: 222 by: @dash0
4 Respuestas
+ 6
Well, I thought I wa going to lose a few neurons by trying to explain, but making mistake in my logical :P
However, I'll get it! :P
The cm() function return an array ( list ) containing three annonymized function items ( using list comprehension ), taking a parameter 'x'... so the array contains three functions without name equivalent to:
def noname1(x):
return i*x
def noname2(x):
return i*x
def noname3(x):
return i*x
The trap is here, in the value used for 'i' variable:
At definition function time, the variable IS NOT replaced by its value, as we can easily missinterpret, but at run-time, so the loop inside the comprehensive list definition is already done and'i' remained with its last value: always 2 for each annonymized function ^^
So, each three function are equivalent to:
def noname(x):
return 2*x
... and so we'll get an array equivalent to:
a = [ noname1, noname2, noname3 ]
... or simpliest:
a = [ noname, noname, noname ]
... and your loop will look as:
for m in a:
print(m(1), end='')
... now, you can now better see/understand what happened:
The three ( same ) functions are successively called, or the unique is called three times, with same parameter, and so returning same value ( 2 ) three time...
The print() function provide the 'end' named parameter wich set an empty string for the output ending ( disabling the default new line char ), producing a one line without space three "2" output: "222" ;)
+ 5
As this, this code doesn't output 222 but throw an undefined global variable 'i' error ^^
+ 3
Good explanation, I had already understood with the help of the interpreter, but it is a good explanation, your dead neurons were not wasted. thx
+ 2
my bad, wrong typing. edited