基于一些调试,我已经将以下代码段脱离了上下文。
我有一个名为'part'的lambda函数,它取决于变量theta和phi。如果你遍历返回的lambda函数列表(d4 [0],d4 [1]等),你会看到它们都返回一个复数,其中虚部为0,而不管theta,phi值是多少我给了这个功能。这是不正确的。对于大多数theta,phi参数,这些函数中的大多数应返回具有非零虚部的复数。知道为什么会这样吗?
import numpy as N
xarr,yarr,zarr = N.meshgrid(N.linspace(-0.5,0.5,32),N.linspace(-1.0,1.0,64),N.linspace(-0.0,0.0,1))
xnum,ynum,znum = xarr.shape
#d1,d2,d3,d4 are for debugging
d1,d2,d3,d4 = [],[],[],[]
for i in range(xnum):
for j in range(ynum):
for k in range(znum):
x,y,z = N.float64(xarr[i,j,k]),N.float64(yarr[i,j,k]),N.float64(zarr[i,j,k])
d1.append(x),d2.append(y),d3.append(z)
part = lambda theta,phi: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))
d4.append(part)
答案 0 :(得分:1)
创建lambda时,需要捕获循环变量的当前值。否则,该函数将在调用时在其创建范围内读取这些变量的值。
可以通过参数默认值来完成:
part = lambda theta,phi, x=x, y=y, z=z, k=k: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))