寻址for循环中列表中包含的二维数组

时间:2013-11-30 08:59:14

标签: python numpy

我正在尝试运行以下代码,energylist是一个二维数组列表。我想在energylist中操纵2-D数组中的元素[k] [i]。这是在for循环中用energylist [r] [k] [i] =(N1 [s] * 0.1 + N2 [t] * 1)完成的。

N1 = xrange(0,4,1)
N2 = xrange(0,4,1)

V1 = arange(-20,20.1,10)
V2 = arange(-20,20.1,10)

energy = zeros((len(V2),len(V1)))
energylist=[]

for l in xrange(0,16,1):
    energylist.append(energy)

for i in xrange(0,len(V1),1):
    for k in xrange(0,len(V2),1):
        r=0
        for s in xrange(0,len(N1),1):
            for t in xrange(0,len(N2),1):
                energylist[r][k][i]= (N1[s]*0.1+N2[t]*1)
                r += 1

然而,在运行它之后,所有在energylist中的数组都是相同的,尽管显然这是不合理的,因为N1和N2已经改变了。如果我用

替换行energylist[r][k][i]= (N1[s]*0.1+N2[t]*1),代码就有效
energy=array(energylist[r])
energy[k][i]= (N1[s]*0.1+N2[t]*1)
energylist[r]=array(energy)

我的原始代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

问题出在您的行中

energylist.append(energy)

此处,您只在REFERENCE只添加一个现有energy数组。因此,您只有一个存储在内存中的数组,被多次引用。如果在任何地方修改此数组,则所有指针都将指向已修改的数组。您的情况并不是您拥有许多具有相同内容的数组 - 您只有一个包含许多引用的数组。

解决方案是:

for l in xrange(0,16,1):
    energylist.append(zeros((len(V2),len(V1))))

在这里,您在每个附加中创建一个显式的新零数组,因此您将获得存储在内存中的16个数组,您可以单独修改它们。