我正在尝试运行以下代码,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)
我的原始代码出了什么问题?
答案 0 :(得分:0)
问题出在您的行中
energylist.append(energy)
此处,您只在REFERENCE只添加一个现有energy
数组。因此,您只有一个存储在内存中的数组,被多次引用。如果在任何地方修改此数组,则所有指针都将指向已修改的数组。您的情况并不是您拥有许多具有相同内容的数组 - 您只有一个包含许多引用的数组。
解决方案是:
for l in xrange(0,16,1):
energylist.append(zeros((len(V2),len(V1))))
在这里,您在每个附加中创建一个显式的新零数组,因此您将获得存储在内存中的16个数组,您可以单独修改它们。