Values and objects
Rotwang
sg552 at hotmail.co.uk
Sun May 11 19:06:29 EDT 2014
On 11/05/2014 19:40, Ned Batchelder wrote:
> On 5/11/14 9:46 AM, Rotwang wrote:
>> On 11/05/2014 04:11, Steven D'Aprano wrote:
>>> [...]
>>>
>>> And try running
>>> this function in both 2.7 and 3.3 and see if you can explain the
>>> difference:
>>>
>>> def test():
>>> if False: x = None
>>> exec("x = 1")
>>> return x
>>
>> I must confess to being baffled by what happens in 3.3 with this
>> example. Neither locals() nor globals() has x = 1 immediately before the
>> return statement, so what is exec("x = 1") actually doing?
>>
>
> The same happens if you try to modify locals():
>
> >>> def test():
> ... if 0: x = 1
> ... locals()['x'] = 13
> ... return x
> ...
> >>> test()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 4, in test
> UnboundLocalError: local variable 'x' referenced before assignment
>
> The doc for exec says:
>
> Note: The default locals act as described for function locals()
> below: modifications to the default locals dictionary should not be
> attempted. Pass an explicit locals dictionary if you need to see
> effects of the code on locals after function exec() returns.
>
> The doc for locals says:
>
> Note: The contents of this dictionary should not be modified;
> changes may not affect the values of local and free variables used
> by the interpreter.
>
> This is a tradeoff of practicality for purity: the interpreter runs
> faster if you don't make locals() a modifiable dict.
Thanks.
More information about the Python-list
mailing list