Python · Intermediário · Inglês · Técnico
late binding
Em closures e lambdas, o valor de uma variável externa é lido só quando a função roda, não quando é definida. Em laços, todas acabam vendo o último valor.
Onde usar
Armadilha clássica de code review: lambdas criadas num for retornam todas o mesmo número. A correção usual é um argumento padrão, como lambda i=i: i, ou functools.partial.
Em código
fs = [lambda: i for i in range(3)]
print([f() for f in fs]) # [2, 2, 2]
ok = [lambda i=i: i for i in range(3)]
print([f() for f in ok]) # [0, 1, 2]Exemplos
All my lambdas return the same value, it's late binding.
Todas as minhas lambdas retornam o mesmo valor, é late binding.
Fix the late binding with a default argument.
Corrija o late binding com um argumento padrão.
Cuidado
Não é bug do interpretador: é o comportamento definido, pois a função guarda a variável, não o valor.
Sinônimos
ligação tardia
Antônimos
early binding