On Thu, May 28, 2020 at 11:57 AM Steven D'Aprano <st...@pearwood.info> wrote:
> On Wed, May 27, 2020 at 05:03:09AM +1000, Chris Angelico wrote: > > > def foo(): > > if False: x = 0 > > # what is x now? > > > > There is no *value* in x, yet x has a state. > > In Python code, no, it has no state, it's just an unbound name. That's > literally a name that has nothing bound to it, hence no state. > > In the CPython 3 implementation, it has a hidden state: there's a fixed > array representing the locals, one of those array slots represents x, > and there is some kind of C-level special state to distinguish between > "this slot is filled" and "this slot is not filled". But that's purely > an optimization. Locals can also be backed by a dict, like globals. > > That is what happens in Jython, so when you call locals() you get back > the actual local namespace dict and modifications to the variables > works. (Unlike in CPython.) > Consider this code: ``` x = 1 def foo(): print(x) x = 2 foo() ``` Here `print(x)` doesn't print '1', it gives `UnboundLocalError: local variable 'x' referenced before assignment`. It knows that `x` is meant to be a local and ignores the global value. That doesn't look like an implementation detail to me - does Jython do something different?
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/7JEVW5XWZALBJLKHXDW4K2FMVQAQ77J3/ Code of Conduct: http://python.org/psf/codeofconduct/