Crear funciones en un bucle

Estoy tratando de crear funciones dentro de un bucle:

functions = []

for i in range(3):
    def f():
        return i

    functions.append(f)

El problema es que todas las funciones terminan siendo las mismas. En lugar de devolver 0, 1 y 2, las tres funciones devuelven 2:

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]

¿Por qué sucede esto y qué debo hacer para obtener 3 funciones diferentes que generan 0, 1 y 2 respectivamente?

Respuestas a la pregunta(2)

Su respuesta a la pregunta