Hans Dushanthakumar wrote:

> Thanks guys
>  
> Yes either of the foll solves the problem:
>  
> b = junk(copy.copy(a))
>  OR
>
> b = junk(a[:])

These work because they make a copy of a and pass (a reference to) the 
copy to the function.

>   Why is there a difference between the way the two lines 
> (x.append("20")  and x = "30") are handled within a function?

Because they are doing different things. x.append("20") calls a method 
on the object bound to the name x. The method mutates the object, so it 
now has a new value. x = "30" binds the name x to a new object, the 
string "30". This binding happens in the local namespace so it doesn't 
affect the value seen by the caller.

You have to change how you think about variables. In Python, a variable 
is not a storage location into which values are put, it is a reference 
to an object - a name given to an object. Assignment binds a name to a 
value.

When you call a function, the names of the formal parameters are bound 
to the values passed in to the function. Parameters are *always* passed 
by reference. The names inside the function are bound to the same 
objects as the names outside the function, so if you call a mutating 
method on the object, like list.append(), the change will be seen 
externally. If you rebind the name inside the function, this has no 
effect on the bindings external to the function.

I hope this helps. There is a fundamental shift in the way you think 
about names that is needed to grok Python. Once you get it much will 
become clearer - The Zen of Python says, "Namespaces are one honking 
great idea -- let's do more of those!" so it's important to understand 
namespaces :-)

This may help:
http://effbot.org/zone/python-objects.htm

Kent

>
>  
> ------------------------------------------------------------------------
> *From:* Adam [mailto:[EMAIL PROTECTED]
> *Sent:* Tuesday, 6 December 2005 1:49 p.m.
> *To:* Hans Dushanthakumar
> *Subject:* Re: [Tutor] How to Pass lists by value
>
> On 06/12/05, *Hans Dushanthakumar* <[EMAIL PROTECTED] 
> <mailto:[EMAIL PROTECTED]>> wrote:
>
>
>     Hi folks,
>        How do I pass a list by value to a function.
>
>     The foll: snippet of code produces the output as shown:
>
>     Code:
>     -----
>     def junk(x):
>         x.append("20")
>         return x
>
>     a = ["10"]
>     b = junk(a)
>
>     print b
>     print a
>
>
>     Output:
>     -------
>>>>
>     b =  ['10', '20']
>     a =  ['10', '20']
>
>     This indicates that the variable "a" was passed by reference
>     because the
>     function alters its value in the main script.
>
>     However, the following code produces a slightly diff output:
>
>     Code:
>     -----
>
>     def junk(x):
>         x = "30"
>         return x
>
>     a = ["10"]
>     b = junk(a)
>
>     print "b = ", b
>     print "a = ", a
>
>     Output:
>     -------
>>>>
>     b =  30
>     a =  ['10']
>
>     In this case, "a" seems to be passed by value, because the value is
>     unchanged even after the call to the function.
>
>
>     Question is, in the 1st scenario, how do I forcefully pass the
>     variable
>     by value rather than reference. Why is there a difference between the
>     two scenarios?
>
>     Cheers
>     Hans
>     _______________________________________________
>     Tutor maillist  -  Tutor@python.org <mailto:Tutor@python.org>
>     http://mail.python.org/mailman/listinfo/tutor
>     <http://mail.python.org/mailman/listinfo/tutor>
>
>
>  
> def junk(x):
>    x.append("20")
>    return x
>
> a = ["10"]
> b = junk(a[:])
>
> That should give you what you're looking for a[:] will pass the values 
> of a.
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor
>  
>


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to