Arguments are passed by assignment. The rationale behind this is twofold:
So:
If you pass a mutable object into a method, the method gets a reference to that same object and you can mutate it to your heart's delight, but if you rebind the reference in the method, the outer scope will know nothing about it, and after you're done, the outer reference will still point at the original object.
If you pass an immutable object to a method, you still can't rebind the outer reference, and you can't even mutate the object.
To make it even more clear, let's have some examples.
Let's try to modify the list that was passed to a method:
def try_to_change_list_contents(the_list):print'got', the_list
the_list.append('four')print'changed to', the_list
outer_list =['one','two','three']print'before, outer_list =', outer_list
try_to_change_list_contents(outer_list)print'after, outer_list =', outer_list
Output:
before, outer_list = ['one', 'two', 'three']
got ['one', 'two', 'three']
changed to ['one', 'two', 'three', 'four']
after, outer_list = ['one', 'two', 'three', 'four']