A certainl part of an if() structure never gets executed.

Dave Angel davea at davea.name
Wed Jun 19 01:42:02 EDT 2013


I think this is an excellent description of name binding with mutable 
objects.  I just have one clarification to insert below.

On 06/19/2013 01:08 AM, Tim Roberts wrote:
> Nick the Gr33k <support at superhost.gr> wrote:
>>
>> On 16/6/2013 4:55 ??, Tim Roberts wrote:
>>
>>> Nick the Gr33k <support at superhost.gr> wrote:
>>> Because Python lets you use arbitrary values in a Boolean context, the net
>>> result is exactly the same.
>>
>> What is an arbitrary value? don even knwo what arbitrary means literally
>> in English.
>
> Basically, it means "any".  In Python, you can use ANY value where a
> Boolean is expected.  All types have a Boolean meaning.  For integers, 0 is
> false, anything else is true.  For strings, an empty string "" is false,
> anything else is true.  For lists, an empty list [] is false, anything else
> is true.  For tuples, an empty tuple () is false, anything else is true.
> For dicts, an empty dict {} is false, anything else is true.
>
>> The argument being returned in an "and" or "or" expression is the one
>> that *determined' the evaluation of the expression.
>
> That's not exactly how I'd put it, but the statement is correct.  The last
> thing it had to evaulate is the result of the expression.
>
>> And actually what's being returned is not the argument itself but the
>> argument's value.
>
> But this is no different than any other programming language.  Expressions
> always use the value of their operands, and they always return a value.
>
> The name vs value thing is critical to understanding Python, in my opinion,
> and it can be a stumbling block when you're coming from another language.
> Here's how I think about it.
>
> Python had two distinct spaces: there is a space for names, and there is a
> space for objects (which are values).  Objects live in a nameless, faceless
> object cloud.
>
> A name is always bound to some object (which might be the "None" object). A
> name always knows its object, but an object never knows what names it is
> bound to.
>
> The only things that can be used in expressions and function arguments are
> objects.  Names are merely the way we specify which objects to be used.

Names are *one of* the ways we specify which objects are to be used. 
(We can also specify objects via an container and a subscript or slice, 
or via an attribute of another object.  And probably another way or two.)

>
>      a = [3]
>
> That creates a nameless list containing a single integer object with the
> value 3.  It then binds the name "a" to that list.  Note that the list has
> no clue that it is bound to any names.
>
>      b = a
>
> That binds "b" to the same list.  "b" and "a" are not related in any way,
> except that they happen to be bound to the same object.  Note that there is
> still only one list.
>
>      a.append(4)
>
> That modifies the list so that it now contains [3,4].  b is bound to the
> same list, so if you
>      print(b)
> you'll see [3,4]
>
> Now, let's say I do this:
>
>      a = [5]
>
> Here's where people get tripped up.  This does not change our original
> list.  Instead, it creates a new nameless list containing 5, and binds the
> name a to that list.  a and b are no longer bound to the same object.
>


-- 
DaveA



More information about the Python-list mailing list