Robert Dailey wrote: > Hi, > > I previously created a topic named "Pass by reference or by value" where > I inquired on how python's function parameters work. I received a lot of > nice responses, however I'm still confused on the topic. Note that I > come from a C++ background to Python, so any comparisons to C++ would be > very helpful. > > I ran a few tests. There's two tests in particular I wanted to show you > guys: > ------------------------------------------------------------------------------------------------ > myvar = [] > > def changeme( param ): > param.append( "blah" ) > print param > > changeme( myvar ) > > print myvar > > The above code yields the following output: > ['blah'] > ['blah'] > > This means that the list passed in was modified by the function. > ------------------------------------------------------------------------------------------------ > Now test case 2: > > myvar = 4 > > def changeme( param ): > param = 5 > print param > > changeme( myvar ) > > print myvar > > The above code yields the following output: > 5 > 4 > > This means that the integer passed in was NOT modified by the function. > ------------------------------------------------------------------------------------------------ > > Between these two tests, both types passed in are mutable objects. I'm > having trouble figuring out what mandates an object to be changed from > within a function versus not. What is happening in test case 2 to cause > it to not be modified? > > Thanks for reading guys. Hopefully one day I'll understand this lol. > The first thin to realise is that all Python names are just bindings to values. In C++ terms you can think of them all as pointers. De-referencing is automatic when a value is to be retrieved.
>>> def changeme( param ): ... param = 3 ... print param ... >>> myvar = [] >>> changeme(myvar) 3 >>> myvar [] >>> In this case there is no attempt to mutate the argument, the argument name is simply bound to another value. Since the argument is a name local to the function, this does not result in any change outside the function. In this case the argument is bound to a mutable value, so the call to append mutates the object (a list) referenced by the argument. Unlike C++ and similar languages a variable does not hold a value, it holds a pointer to a value. When a list is passed as a function argument the reference to the list is copied into the argument. Does this help at all? regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden --------------- Asciimercial ------------------ Get on the web: Blog, lens and tag the Internet Many services currently offer free registration ----------- Thank You for Reading ------------- -- http://mail.python.org/mailman/listinfo/python-list