Values and objects
Devin Jeanpierre
jeanpierreda at gmail.com
Sat May 10 17:03:11 EDT 2014
On Sat, May 10, 2014 at 12:10 PM, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 05/10/2014 02:32 AM, Chris Angelico wrote:
>>
>>
>> Tell me, what may this function do in a compliant Python?
>>
>> def demo():
>> ret = spam
>> spam = 23
>> return ret
>>
>> In CPython, that'll raise UnboundLocalError, because the local
>> variable 'spam' does already exist, and currently has no value (no
>> object bound to it).
>
>
> No, it does not exist -- or, more accurately, it does not exist *yet* but
> will. The fact that there is a slot waiting for what will be spam is a
> cpython implementation detail.
The name of the exception is "UnboundLocalError". And the message says
that we referred to a "local variable".
Also see the language reference:
"When a name is not found at all, a NameError exception is raised. If
the name refers to a local variable that has not been bound, a
UnboundLocalError exception is raised. UnboundLocalError is a subclass
of NameError."
spam is referring to a local variable that has not been bound. This is
not an implementation detail.
> And if you don't like that argument (although it is a perfectly sound and
> correct argument), think of the module name space:
>
>
> ret = spam
> spam = 23
>
> will net you a simple NameError, because spam has not yet been created.
Because module level variables work differently from local variables.
-- Devin
More information about the Python-list
mailing list