3 ms·
In Python 2.6: def acc(x): foo = x def closures_are_broken(): foo += 1 return foo return closures_are_broke
by silentbicycle 17y ago
In Python 2.6:
def acc(x):
foo = x
def closures_are_broken():
foo += 1
return foo
return closures_are_broken
def acc2(x):
foo = [x]
def closure_with_workaround():
foo[0] += 1
return foo[0]
return closure_with_workaround
The former is an error ("UnboundLocalError: local variable 'foo' referenced before assignment"), the latter is a workaround by manually boxing the variable in a list. I'm not sure why that works, but it's rather ugly.
The same, in Lua:
function acc(x)
local foo = x
return function()
foo = foo + 1
return foo
end
end
- eru 17y agoOh, yes. You are mutating variables. You shouldn't do that anyway in a functional setting. Python's syntax forces the language to guess whether you want to make a new variable or use the variable of the same name from the outer scope. The heuristic they have, says that if you assign something to the variable, you get a new one by default. You can declare global x before to assign to the variable in the outerscope.