Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

429
Visualizações
La iteración en un bucle for sobrescribe las distintas claves de dictado previamente definidas al vincular nuevas claves a nuevas funciones lambda. ¿Es esto esperado?

Posiblemente soy muy ingenuo, pero encuentro inesperado el siguiente comportamiento.

Introducción: necesito un contenedor para abordar dinámicamente los métodos de mi propia clase, modelo. Estoy tratando de usar un dictado para tener una entrada separada para cada uno de los miembros de la clase que se solicitan dinámicamente. Enlazo las claves de dictado a los miembros elegidos de forma iterativa y encuentro que la cadena de documentos se conserva, pero los métodos se sobrescriben con el último elemento de la iteración, a pesar de sus claves distintas. Aquí hay un fragmento donde reproduzco el comportamiento con numpy, en lugar de mi propia clase.

 import numpy as np name = ["sin","cos"] bnd = {} print('Within the defining loop, it works!\n') for nam in name: # useless indirect function (with doc string) # equivalent to sin(2*pi*x) # or to cos(2*pi*x) bnd[nam] = lambda x, par: np.__getattribute__(nam)(x*par) bnd[nam].__doc__ = '"""'+nam+'"""' print('bnd doc in-loop: {} = {}'.format(nam,bnd[nam].__doc__)) print('bnd method in-loop {}(0,2*pi) = {}'.format(nam,bnd[nam](0,2*np.pi))) print('\n However after the loop...') print('bnd keys {}'.format(bnd.keys())) print('\nfirst function doc: {}'.format(bnd["sin"].__doc__)) print('doc is preserved, but instead the method') print('(should be sin(2 pi *0)) yields {}'.format(bnd["sin"](0,2*np.pi))) print('\nsecond trial_function doc: {}'.format(bnd["cos"].__doc__)) print('doc is preserved, again, and this time the method') print('(should be cos(2 pi *0)) yields correctly {}'.format(bnd["cos"](0,2*np.pi))) print('\nSummary: bnd[nam] gets overwritten by the last lambda definition in the loop. \n\nWhy????')

Si ejecutas el código obtienes lo siguiente

 Within the defining loop, it works! bnd doc in-loop: sin = """sin""" bnd method in-loop sin(0,2*pi) = 0.0 bnd doc in-loop: cos = """cos""" bnd method in-loop cos(0,2*pi) = 1.0 However after the loop... bnd keys dict_keys(['sin', 'cos']) first function doc: """sin""" doc is preserved, but instead the method (should be sin(2 pi *0)) yields 1.0 second trial_function doc: """cos""" doc is preserved, again, and this time the method (should be cos(2 pi *0)) yields correctly 1.0 Summary: bnd[nam] gets overwritten by the last lambda definition in the loop. Why????

que espero esté aclarando mi pregunta.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Como otros han explicado. Solo hay una variable nam en su función. Cuando crea la lambda, no captura el valor de nam como estaba cuando se creó la lambda. Más bien, todas las lambdas comparten el mismo nam y tiene el valor que tenía al final de la función.

Hay varios conseguir arounds. Esencialmente necesitas capturar nam como una variable.

La forma "oficial" de hacer esto es simplemente escribir:

 def attribute_getter(nam): return lambda x, par: np.__getattribute__(nam)(x*par) bind[nam] = attribute_getter(nam)

La solución rápida y sucia es:

 bind[nam] = lambda x, par, nam=nam: np.__getattribute__(name)(x * par)

La variable nam se convierte en una opción que se establece en el valor actual de nam .


Editar: Cambió "programa" a "función".

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda