When you are dealing with an immutable object, you cannot change the data within. For instance, the following is invalid because the tuple type is immutable:
somevar = (1, 2)
somevar[0] = 3 # boom!
The only way to change the data within an immutable is to create a new object with the new data and reassign it to the variable. The original object is then cleared from memory by the garbage collector if nothing points to the object anymore.
When you pass a variable to a function, if you can 'edit' it (i.e.: it is mutable), the outer-scope will see the changes because you are not changing the memory address of the variable:
def edit(l):
l[0] = 3
somelist = [1, 2, 3]
edit(somelist)
print somelist # [3, 2, 3]
'l' in this case is a variable that points to your global list and you are modifying the data within; you are not changing the memory address.
It is different than:
def edit(l):
l = [3, 2, 3]
somelist = [1, 2, 3]
edit(somelist)
print somelist # [1, 2, 3]
In this case, the memory address pointed by 'l' changes with the '=' statement. But because you are in the scope of a function, somelist still exists and still points to the old location of 'l'.
When you use 'global', you don't get a function-scoped variable like when you receive it as an argument. Instead, you are using the actual global variable, so if you reassign it, you are effectively playing with the variable at the global level and not at the function level.
somelist = [1, 2, 3]
def edit():
global somelist
somelist = [3, 2, 3]
edit()
print somelist # [3, 2, 3]
-- EDIT --
In answer to you question, here's how you can change a global immutable using a function (useless example, but you can see the mechanic):
def edit(l):
val1, val2, val3 = l
return (3, val2, val3)
sometuple = (1, 2, 3)
sometuple = edit(sometuple)
print sometuple # (3, 2, 3)
I suggest this read: Short Description of the Scoping Rules?