title: Understanding Python's call-by-object style of passing function arguments
body: <p>I am not sure I understand the concept of Python's call by object style of passing function arguments (explained here <a href="http://effbot.org/zone/call-by-object.htm" rel="noreferrer">http://effbot.org/zone/call-by-object.htm</a>). There don't seem to be enough examples to clarify this concept well (or my google-fu is probably weak! :D)</p>
  
  <p>I wrote this little contrived Python program to try to understand this concept</p>
  
  <pre><code>def foo( itnumber, ittuple,  itlist, itdict   ):
      itnumber +=1 
      print id(itnumber) , itnumber 
  
      print id(ittuple)  , ittuple
  
      itlist.append(3.4)
      print id(itlist)   , itlist
  
      itdict['mary']  = 2.3
      print id(itdict),    itdict
  
  
  
  # Initialize a number, a tuple, a list and a dictionary
  tnumber = 1
  print id( tnumber ), tnumber 
  
  ttuple  = (1, 2, 3)
  print id( ttuple ) , ttuple
  
  tlist   = [1, 2, 3]
  print id( tlist ) , tlist
  
  tdict = tel = {'jack': 4098, 'sape': 4139}
  print '-------'
  # Invoke a function and test it
  foo(tnumber, ttuple, tlist , tdict)
  
  print '-------'
  #Test behaviour after the function call is over
  print id(tnumber) , tnumber 
  print id(ttuple)  , ttuple
  print id(tlist)   , tlist
  print id(tdict),  tdict
  </code></pre>
  
  <p>The output of the program is </p>
  
  <pre><code>146739376 1
  3075201660 (1, 2, 3)
  3075103916 [1, 2, 3]
  3075193004 {'sape': 4139, 'jack': 4098}
  
  ---------
  
  146739364 2
  3075201660 (1, 2, 3)
  3075103916 [1, 2, 3, 3.4]
  3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
  
  ---------
  
  146739376 1
  3075201660 (1, 2, 3)
  3075103916 [1, 2, 3, 3.4]
  3075193004 {'sape': 4139, 'jack': 4098, 'mary': 2.3}
  </code></pre>
  
  <p>As you can see , except for the integer that was passed, the object id's (which as I understand refers to memeory location) remain unchanged. </p>
  
  <p>So in the case of the integer, it was (effectively) passed by value and the other data structure were (effectively) passed by reference. I tried changing the list , the number and the dictionary to just test if the data-structures were changed in place. The number was not bu the list and the
  dictionary were. </p>
  
  <p>I use the word <strong>effectively</strong> above, since the 'call-by-object' style of argument passing seems to behave both ways depending on the data-structure passed in the above code</p>
  
  <p>For more complicated data structures, (say numpy arrays etc), is there any quick rule of thumb to
  recognize which arguments will be passed by reference and which ones passed by value? </p>