3 ms·
Looks like classes can't be closures, though: >>> def f(): ... x = 5 ... class Blub: ... def incx(self): ...
by moonchild 6y ago
Looks like classes can't be closures, though:
>>> def f():
... x = 5
... class Blub:
... def incx(self):
... x += 1
... def getx(self):
... return x
... return Blub()
...
>>> j = f()
>>> j.incx()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in incx
UnboundLocalError: local variable 'x' referenced before assignment
- cessor 6y agoWhen using it like this, the interpreter opens a new namespace where the variables are bound. The x is declared in the outer scope, so it can't find it. However, you can ask python to keep searching vor the name `x` in the closest outer scope, that is what the `nonlocal` statement is for: def f(): x = 5 class Blub: def incx(self): nonlocal x x += 1 def getx(self): return x return Blub() j = f() j.incx() print(j.getx()) This will print 6, as expected.