我正在尝试使用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函数。
答案 0 :(得分:2)
您需要在参数列表中评估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
将引用父上下文(如您所知)。