Understanding python functions - Instant Python tutorial

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Jul 12 22:55:45 EDT 2007


En Thu, 12 Jul 2007 21:51:08 -0300, Chris Carlen  
<crcarleRemoveThis at BOGUSsandia.gov> escribió:

> Hi:
>
> I have begun learning Python by experimenting with the code snippets  
> here:
>
> http://hetland.org/writing/instant-python.html
>
> In the section on functions, Magnus Lie Hetland writes:
>
> --------------------------------------------------------------------
> For those of you who understand it: When you pass a parameter to a
> function, you bind the parameter to the value, thus creating a new
> reference. If you change the “contents” of this parameter name (i.e.
> rebind it) that won’t affect the original. This works just like in Java,
> for instance. Let’s take a look at an example:
>
> def change(some_list):
>      some_list[1] = 4
>
> x = [1,2,3]
> change(x)
> print x # Prints out [1,4,3]
>
> As you can see, it is the original list that is passed in, and if the
> function changes it, these changes carry over to the place where the
> function was called.  Note, however the behaviour in the following  
> example:
>
> def nochange(x):
>      x = 0
>
> y = 1
> nochange(y)
> print y # Prints out 1
>
> Why is there no change now? Because we don’t change the value! The value
> that is passed in is the number 1 — we can’t change a number in the same
> way that we change a list. The number 1 is (and will always be) the
> number 1. What we did do is change the contents of the local variable
> (parameter) x, and this does not carry over to the environment.
> --------------------------------------------------------------------
>
> What this looks like to me is what would happen if in C I passed a
> pointer to the list x to the function change(), as in:
>
> change(&x);
>
> Thus the function could change the original list.
>
> I don't understand Hetland's terminology though, when he is speaking of
> "binding" and "reference."  Actually, Hetland's entire first paragraph
> is unclear.
>
> Can anyone reword this in a way that is understandable?

First, see this short article http://effbot.org/zone/python-objects.htm

Now, forget about C "variables" and "pointers" because you won't get much  
far with those concepts.
Objects exist - and we usually use names to refer to them. This line:

a =  1

means "make the name 'a' refer to the object 1", or, "bind the name 'a' to  
the instance of type int with value 1", or "let 'a' be a reference to the  
object 1"

This line:

some_list[1] = 4

means "make the second element of some_list refer to the object 4", or  
"alter some_list so its element [1] is a reference to the object 4"

bind the name 'a' to the instance of type int with value 1", or "let 'a'  
be a reference to the object 1"

Note that some objects are immutable - like the number 1, which will  
always be the number 1 (*not* an integer "variable" that can hold any  
integer value). Other objects -like lists and dictionaries, by example, or  
most user defined classes- are mutable, and you can change its contents  
and properties. Modifying an object is not the same as rebinding its name:

x = [1,2,3]
y = x
x[1] = 4
print x		# [1, 4, 3]
print y 	# [1, 4, 3]

x = [1,2,3]
y = x
x = [1,4,3]
print x		# [1, 4, 3]
print y		# [1, 2, 3]

You can test is two names refer to the same object using the is operator:  
x is y. You will get True in the first case and False in the second case.

-- 
Gabriel Genellina




More information about the Python-list mailing list