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