执行以下代码时出现以下错误:索引超出范围

时间:2014-10-07 14:19:28

标签: python file syntax-error

def evolve():
    global pop,fvals
    for g in xrange(0,gmax):     
        for i in xrange(0,NP):           
            while 1:
                r1=random.randint(0,NP-1)
                if r1!=i:          
                    break           
            while 1:
                r2=random.randint(0,NP-1)
                if r2!=r1 and r2!=i:
                    break
            while 1:
                r3=random.randint(0,NP-1)
                if r3!=r2 and r3!=r1 and r3!=i:
                    break
            U=[]
            V=[]
            for j in xrange(0,dim):    
                   U.insert(j,(pop[r3])[j] + F*((pop[r1])[j]-(pop[r2])[j]))                     
            jrand = floor(int(rand1()*dim)) 
            for j in xrange(0,dim):
        if rand1()<=cr or j==jrand:
                     U.insert(j,(pop[r3])[j] + F*((pop[r1])[j]-(pop[r2])[j]))  
                else:
                     U.insert(j,(pop[i])[j])         
            V.insert(i,U)                         
        fvals2.insert(i,fun(U)) 
        x=open("x.out","w")         
        for i in xrange(NP):
            for j in xrange(dim):
               print i
           print j
               x.write(str((V[i])[j]) + '\t')
            x.write(str(fvals2[i]))
            x.write('\n')

执行此代码块时显示错误:

x.write(str((V[i])[j]) + '\t')
IndexError: list index out of range

我已采取gmax=5dim=2NP=5

1 个答案:

答案 0 :(得分:0)

您在每个V循环中将[]设置为for n in xrange(0,NP),丢失之前的任何值。这意味着,当您编写文件时,V只包含一个值(最多),这就是您在尝试阅读{{{{{{{{{{{{{{{{{{{{{{{{ 1}}中的值。您可能希望在该循环之外初始化xrange(NP)

您还错过了V上的一些缩进,但我猜测将这些代码放入您的帖子时发生了这种情况,或者它可能无法运行得足够远写入文件时的IndexError。

除此之外,请考虑以下事项:

  1. 请用实际名称命名变量 - 所有这些单个字母和字母数字组合使代码真的难以阅读。
  2. 您可能还会考虑将这些嵌套操作中的某些操作分解为单独的函数,这也可以提高可读性。
  3. 在您完成编写后,您不会关闭输出文件 - 您可能希望在结尾添加if rand1()<=cr or j==rand行或在x.close()内完成所有写入操作块。您还要在with open('x.out','w') as x:的每个循环上覆盖该文件,因此您可能也希望将其移到该循环之外。