IndexError:列表索引超出python动态变量长度的范围

时间:2018-12-15 15:57:46

标签: python index-error dynamic-variables

尽管我正在使用函数在Python中创建一个基本的for循环,以便使用动态变量长度(z),但我遇到了以下错误:

Rs = []
z = []
N = 120
m = 1
for i in range(1, N):
    Rs[i] = z[m]
    m = m + 1
Rs[i] = z[m]  
IndexError: list index out of range

为了清楚起见,我将更好地解释我要做什么。 我想解决由动态未知数组成的方程组。 我已经开始使用“静态”方法,并且效果很好。基本上,代码大致如下:

from scipy.optimize import fsolve

def fixEqSyst(z):
    v1 = z[0]
    v2 = z[1]
    v3 = z[2]
    v4 = z[3]
    f=np.zeros(4)
    f[0] = 2*v1-3*v2+7*v3**2
    f[1] = v1+3*v2**2-9*v3
    f[2] = -3v1**2+12*v2+7*v3
    f[3] = 4*v1+5*V2*v3
    return f

z = fsolve(fixEqSyst, [0, 0, 0, 0])

基于现在我将面对数量众多的未知数和函数的事实,除了我已经采用的解决方案之外,还有其他解决方案吗? (采用for-loop策略)

2 个答案:

答案 0 :(得分:2)

仅在循环的第一次迭代中您就会得到

Rs[1] = z[1]

但是z[1]不存在,因为z = []

(与Rs[1]相同。)

我不知道如何解决它,因为我无法猜测您想对您的代码执行什么操作。

也许您想将列表z的包含内容(假定为非空)复制到Rs。然后是两种不同的简单解决方案:

Rs = z   

注意! 这不是复制操作,只会将其他名称同一对象相关联,因此z中的每一次更改都会产生Rs中的变化相同,反之亦然。

Rs = z[:]

这是真实的(但 shallow )副本。对于简单列表,这与副本相同。

答案 1 :(得分:1)

在python中为数组分配值时,该元素必须已经存在。分配Rs[i] = z[m]时,分配的值超出列表范围。您可以在列表上使用+=运算符,以使其足够大,如下所示:

Rs = []
z = []
N = 120
m = 1
for i in range(m+N):
    z += [m+i]
for i in range(N):
    Rs += [z[m]]
    m = m + 1

请注意,+=只能将一个列表连接到另一个列表。这样就可以了:

mylist = [1, 2, 3]
mylist += [4]

但这不会:

mylist = [1, 2, 3]
mylist += 4

Here在列表的+ =运算符上更多。