访问列表的元素,它不可调用?

时间:2014-08-06 23:04:04

标签: python

仅供参考我的代码

def makeList (start,end,h):
    a=[]
    a.append(start)
    n=(end-start)/h

    while(n!=0):    
        new=a[-1] +h
        a.append(a[-1] +h)
        n=n-1
    return a

def generateBase(xList,f):

    if(len(xList)==0):
        return []
    elif(xList[0]==0 or len(xList)==1):
        return ([(xList[0],0,0)] + generateBase(xList[1:],f))

    else:
        return ([(xList[0],0,(f(xList[0])))] + generateBase(xList[1:],f))

def getThird(a):
    return a[2]

def fdm(alpha,startx,endx,startt,endt,dx,dt,f):
    baseSolution=generateBase((makeList(startx,endx,dx)),f)
    totalSoltuion= baseSolution + startCalc(alpha,(makeList(startx,endx,dx)),(makeList(startt,endt,dt))[1:],baseSolution,dx,dt,[],[])

def startCalc(alpha,xList,tList,phiSolutions,dx,dt,newPhi,newX):
    print newPhi
    if(len(tList)==0):
        return []
    elif (len(xList)==1):
        return ([(xList[0],tList[0],0)] + startCalc(alpha,(newX + [xList[0]]),tList[1:],(newPhi + [(xList[0],tList[0],0) ]),dx,dt,[],[]))
    elif (xList[0]==0):
        return ([(xList[0],tList[0],0)] + startCalc(alpha,(xList[1:]),tList,phiSolutions,dx,dt,(newPhi + [(xList[0],tList[0],0)]),(newX + [xList[0]]))) 

    else:
        print getThird(phiSolutions[0])
        print getThird(phiSolutions[1])
        print getThird(phiSolutions[2])
        sol=newPhi(xList[0],tList[0],getThird(phiSolutions[0]),getThird(phiSolutions[1]),getThird(phiSolutions[2]),alpha)
        return ([sol] + startCalc(alpha,(xList[1:]),tList,phiSolutions[1:],dx,dt,(newPhi + [sol]),(newX + [xList[0]]))) 




def newPhi(x,t,phiL,phiC,phiR,dx,dt,alpha):
    return (x,t,(phiC + (alpha*(dt/(dx**2)))*(phiR-(2*phiC)+phiL)) )

def showMe(SolutionList):
    GraphSolution(SolutionList)

showMe(fdm(1,0,1,0,1,.1,.01,(lambda x:x+1)))

问题在这里

sol=newPhi(xList[0],tList[0],getThird(phiSolutions[0]),getThird(phiSolutions[1]),getThird(phiSolutions[2]),alpha)

我遇到了这个问题

TypeError: 'list' object is not callable

这些数组中的东西是实数,我认为这个问题只发生在我尝试调用类似函数的列表时,如果我喜欢phiSolution(0)我不确定是什么想法问题,我打印出来的所有内容一个数字,如果有人能给我一些很好的见解。

2 个答案:

答案 0 :(得分:2)

看看你的递归电话:

return ([(xList[0],tList[0],0)] + startCalc(alpha,(newX + [xList[0]]),tList[1:],(newPhi + [(xList[0],tList[0],0) ]),dx,dt,[],[]))

特别要仔细查看您的参数列表。它分解为这些论点:

startCalc(alpha, # arg 1
          (newX + [xList[0]]), #arg 2
          tList[1:], #arg 3
          (newPhi + [(xList[0],tList[0],0) ]), # arg 4
          dx, # arg 5
          dt, # arg 6
          [], # arg 7
          []) # arg 8

根据您对startCalc ...

的定义
startCalc(alpha,xList,tList,phiSolutions,dx,dt,newPhi,newX)

... newPhi是位置参数#7。因此,当您进行尾递归调用时,会为newPhi分配一个空列表。因此newPhi 一个列表,sol=newPhi(<anything>)确实试图调用它。如果您要尝试索引列表,请使用括号:

sol = newPhi[index]

另外,如另一个答案中所述,您使用标识符newPhi作为函数名称和startCalc的输入参数名称。您需要更改其中一个来解决冲突。

答案 1 :(得分:2)

因为newPhi是一个列表,因此无法调用。

请注意,您已定义newPhi两次:一次作为函数(在代码中的第48行,startCalcshowMe的定义之间),以及第7次约为第29行的startCalc函数的参数。引发TypeError时生效的定义是startCalc参数{。}}。

startCalcfdm函数的第二行在第27行调用:

    totalSoltuion= baseSolution + startCalc(alpha,(makeList(startx,endx,dx)),(makeList(startt,endt,dt))[1:],baseSolution,dx,dt,[],[])

如果你计算了7个参数,你会发现你正在传递一个空列表([])。

如果您希望newPhi成为其中的函数,请移动上面的定义 startCalc的定义,并重命名当前正在干扰的newPhi参数使用newPhi功能。你不能将它既是一个列表(见第34和36行)和一个函数(第42行)。