Alcance de las funciones lambda y sus parámetros

Necesito una función de devolución de llamada que sea casi exactamente la misma para una serie de eventos de interfaz gráfica de usuario. La función se comportará de manera ligeramente diferente según el evento que la haya llamado. Me parece un caso simple, pero no puedo entender este comportamiento extraño de las funciones lambda.

Así que tengo el siguiente código simplificado a continuación:

def callback(msg):
    print msg

#creating a list of function handles with an iterator
funcList=[]
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(m))
for f in funcList:
    f()

#create one at a time
funcList=[]
funcList.append(lambda: callback('do'))
funcList.append(lambda: callback('re'))
funcList.append(lambda: callback('mi'))
for f in funcList:
    f()

La salida de este código es:

mi
mi
mi
do
re
mi

Esperaba

do
re
mi
do
re
mi

Por qué usar un iterador ha estropeado las cosas?

He intentado usar una copia profunda:

import copy
funcList=[]
for m in ('do', 're', 'mi'):
    funcList.append(lambda: callback(copy.deepcopy(m)))
for f in funcList:
    f()

Pero esto tiene el mismo problema.

Respuestas a la pregunta(20)

Su respuesta a la pregunta