Python类中的Lambda引用self



我正试图使用lambda在Python类中定义一个函数,我想引用调用它的类的实例,但不知道如何定义。

properties.append(pf.moleculeProperties())
properties[-1].name = "Monatomic Hydrogen"
properties[-1].formula = "H"
properties[-1].mass = (1.00795e-3)/(6.022e23)
properties[-1].elecLevels = [[pf.waveNumToJoules(82309.58), 1]]
properties[-1].q = lambda T,V : pf.q_trans(properties[-1],T,V) * pf.q_elec(properties[-1],T,V)
properties.append(pf.moleculeProperties())
properties[-1].name = "Monatomic Oxygen"
properties[-1].formula = "O"
properties[-1].mass = (16.0e-3)/(6.022e23)
properties[-1].elecLevels = [[pf.waveNumToJoules(158.265), 1], [pf.waveNumToJoules(226.977), 1], [pf.waveNumToJoules(15867.862), 1],
           [pf.waveNumToJoules(33792.583), 1], [pf.waveNumToJoules(73768.200), 1], [pf.waveNumToJoules(76794.978), 1], [pf.waveNumToJoules(86625.757), 1]]
properties[-1].q = lambda T,V : pf.q_trans(properties[-1],T,V) * pf.q_elec(properties[-1],T,V)

当我尝试对列表的最后一个成员以外的其他成员调用q时,它似乎会评估属性[-1]语句,并每次给我列表的最后成员。在这个例子中,我试图调用元素上对应于氢的q函数,得到氧的q函数。

您需要在参数列表中计算properties,而不是lambda的主体,以便它尽早绑定。因此,将q定义为:

properties[-1].q = lambda T,V,self=properties[-1] : pf.q_trans(self,T,V) * pf.q_elec(self,T,V)

执行上述操作时,对self的赋值只计算一次,并永久绑定到lambda。否则,properties将引用父上下文(正如您所发现的)。

最新更新