Is an interactive command a block?

Benjamin Kaplan benjamin.kaplan at case.edu
Fri Nov 20 14:06:24 CET 2009


On Thu, Nov 19, 2009 at 4:42 PM, Alf P. Steinbach <alfps at start.no> wrote:
> * Steven D'Aprano:
>>
>> On Thu, 19 Nov 2009 21:37:17 +0100, Alf P. Steinbach wrote:
>>
>>> The CPython 3.1.1 language reference §4.1 says
>>>
>>>   "Each command typed interactively is a block."
>>>
>>> It also says
>>>
>>>   "If a name is bound in a block, it is a local variable of that block,
>>>   unless
>>>    declared as nonlocal"
>>>
>>> Even with a non-literal try-for-best-meaning reading I can't get this to
>>> mesh with the actual behavior of the interpreter, e.g.
>>>
>>>   >>> for x in "poi":
>>>   ...    fandango = 666
>>>   ...
>>>   >>> fandango
>>>   666
>>>   >>> _
>>>
>>> My current understanding is (A) that the interpreter is correct in this
>>> respect (for one would harldly want the effects of statements to be
>>> fundamentally different in interpreted mode, except the presentation of
>>> expression results), and (B), but here I'm less sure, that the
>>> documentation is incorrect.
>>
>>
>> Why do you say that? I don't see what it is in the command you typed that
>> leads you to think the documentation is incorrect.
>>
>> The first command you type is:
>>
>> for x in "poi":
>>    fandango = 666
>>
>>
>> which binds two names, x and fandango. Since you are not typing them in a
>> function or class definition, locals() is globals() and the two local names
>> you create happen to also be globals.
>
> Thanks, that may be it.
>
> In most other languages I'm familiar with, if a name is local then it isn't
> global (and vice versa), and I had that as an underlying assumption since it
> doesn't appear to be mentioned in the documentation.
>
> However, I find a language reference statement that alludes to this: "(The
> variables of the module code block are local and global.)"
>
> Hm...
>
>
>> The next two commands you type:
>>
>> fandango
>> _
>>
>> don't bind anything, so aren't relevant.
>
> Well it showed that 'fandango' had been defined as a global. :-)
>
>
>> If it helps:
>>
>>
>>>>> for x in "poi":
>>
>> ...     fandango = 666
>> ...
>>>>>
>>>>> locals() is globals()
>>
>> True
>>>>>
>>>>> fandango
>>
>> 666
>>>>>
>>>>> locals()['fandango']
>>
>> 666
>>>>>
>>>>> import __main__
>>>>> __main__.fandango
>>
>> 666
>
> Yeah, helps.
>
> I feel that there's still something lacking in my understanding though, like
> how/where the "really actually just pure local not also global" is defined
> for function definition, but it's now just a vague feeling of something
> missing, not a feeling of direct contradiction as I had when I believed
> local != global.
>

It's because the only blocks in python that have their own scope are
classes and functions. For loops don't have their own scope- they use
the enclosing one, which in this case is globals.

>
> Cheers, & thanks,
>
> - Alf
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list