Bueno eso es por que python no tiene propiamente variables si no que tiene "nombres" o "identificadores"
Ejemplo:
Código Python:
Ver originala = 1 #Uno tiene el nombre de a
a = 2 #Ahora 2 tiene el nombre de a
b = a #Ahora 2 tiene el nombre de a y b
#Hasta aquí probablemente lo encuentres absurdo
#Asi que veamos otro ejemplo
a = [1, 2, 3] #Esta lista tiene el nombre de a
b = a #Ahora la lista tiene el nombre a y b
b.append(4) #La lista queda [1, 2, 3, 4], nota que esta operación es in-place
#Como la lista tiene los nombres a y b entonces
print a
>>> [1, 2, 3, 4]
print b
>>> [1, 2, 3, 4]
Veamos varios casos para comprender que pasa.
Código Python:
Ver originaldef foo(bar):
#hasta este punto bar = 3, 3 tiene el nombre de bar
bar = 1 #Ahora 1 tiene el nombre de bar (local), esta no es una operación in-place
bar = 3 #Bar en alcance global
foo(bar) #Pasamos Bar como parametro
Código Python:
Ver originaldef foo(bar):
bar.append(1) #Agregamos 1 a bar, operación in-place
bar = [] #ahora bar es una lista
foo(bar) #Pasamos a bar como parámetro
Código Python:
Ver originaldef foo():
bar = 1 #Creamos un bar (local) = 1
bar = 2 #Bar (global) = 2
foo() #Llamamos a foo
Código Python:
Ver originaldef foo():
global bar #Decimos que vamos a trabajar con bar (global)
bar = 1 #A uno le ponemos el nombre de bar (global)
bar = 2 #Bar (global) igual a 2
foo() #Llamamos a foo