Criando funções em um loop

Estou tentando criar funções dentro de um loop:

functions = []

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

    functions.append(f)

O problema é que todas as funções acabam sendo as mesmas. Em vez de retornar 0, 1 e 2, todas as três funções retornam 2:

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

Por que isso está acontecendo e o que devo fazer para obter três funções diferentes que produzem 0, 1 e 2, respectivamente?

questionAnswers(2)

yourAnswerToTheQuestion