Trouble entendiendo valores de paso y referencias en Python

Tener problemas con cuándo se cambian los objetos y cuándo no están en Python. Aquí está mi ejemplo mal ideado a continuación:

class person:
    age = 21

class bar:
    def __init__(self, arg1):
        self.foo = arg1
        self.foo.age = 23

def baz(arg1):
    arg1.age = 27

def teh(arg1):
    arg1 = [3,2,1]

Person1 = person()
bar1 = bar(Person1)

print Person1.age
print bar1.foo.age

baz(Person1)

print Person1.age
print bar1.foo.age

meh = [1,2,3]
teh(meh)
print meh

La salida es

23
23
27
27
[1, 2, 3]

Entonces, cuando declaramos Person1, Person1.age es 21. Una referencia a este objeto se pasa al constructor de clase de otra instancia de clase de bar, llamada bar1. Cualquier cambio realizado a esta referencia cambiará a Person1.

Este también es el caso cuando pasamos Person1 a una función normal, Person1.age ahora es igual a 27.

Pero ¿por qué esto no funciona en la variable "meh"? Ciertamente, si asignamos una variablea = meh y cambioa = [6, 6, 6], entonces meh también será cambiado. Estoy confundido. ¿Hay alguna literatura sobre cómo funciona todo esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta