2 ms·
...it wouldn't be as big an issue if Python's closures and scoping weren't problematic as well.
by silentbicycle 17y ago
...it wouldn't be as big an issue if Python's closures and scoping weren't problematic as well.
- eru 17y agoAs far as I know Python has true lexical scoping for functions, if not for blocks. (They used to have very limited scoping ages ago.) What do you mean?
- silentbicycle 17y agoIn 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.