Python newbie

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Fri Sep 19 09:44:06 CEST 2008


On Fri, 19 Sep 2008 09:13:48 +0200, Mladen Gogala wrote:

> There are several questions:
> 
> 1) Why is the array "a" unchanged after undergoing a transformation with
>    map?

Because `map()` creates a new list and doesn't change the elements in `a`.

> 2) Why is it illegal to pass a built-in function "print" to map?

Because ``print`` isn't a function but a keyword.  This will be changed 
in Python 3.0.  On the other hand this use case is discouraged because 
`map()` builds a new list with the return value of the given function.  
So you would build a list full of `None`\s just for the side effect.

> 3) Why is the array "a" unchanged after undergoing an explicit
>    transformation with the "for" loop?

Because there is no explicit transformation.  The loop binds elements to 
the name `x` in your example and within the loop you rebind that name to 
another value.  Neither the name `x` nor the objects bound to it have any 
idea that the object might be referenced in some container object.

> 4) Is there an equivalent to \$a (Perl "reference") which would allow me
>    to decide when a variable is used by value and when by reference?

No, variables in Python are always name to object bindings.  Don't think 
of variables as boxes with names on it where you put objects in, or 
references to another box.  Think of objects and sticky notes with names 
on it.

> How can I make sure that
> for x in a: x=2*x
> 
> actually changes the elements of the array "a"?

Well, actually change the elements.  ;-)

Either:

for index, item in enumerate(sequence):
    sequence[index] = func(item)

Or:

sequence[:] = map(func, sequence)

But the need to do so doesn't seem to be that frequent.  Usually one just 
builds a new list instead of altering an existing one.

Ciao,
	Marc 'BlackJack' Rintsch



More information about the Python-list mailing list