为什么会这样?我是否必须使用numpy.array的副本?但 它似乎适用于第一个代码。无法弄清楚原因。
import numpy as np
n=3
h_all=[]
h=np.zeros((n,n))
for i in range(0, n):
h = h + 1.
h_all.append(h)
print h_all
它给出了
[array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]), array([[ 2., 2., 2.], [ 2., 2., 2.], [ 2., 2., 2.]]), array([[ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.]])]
哪个好 但如果我编码为
n=3
h_all=[]
h=np.zeros((n,n))
maxnum=3
for k in range(0, n):
for i in range(0, n):
for j in range(0, n):
h[i,j] = h[i,j] + 1.
h_all.append(h[:])
print h_all
It becomes: [array([[ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.]]), array([[ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.]]), array([[ 3., 3., 3.], [ 3., 3., 3.], [ 3., 3., 3.]])]
答案 0 :(得分:0)
for k in range(0, n):
....
h_all.append(h[:])
在h
列表中放置一个指向h_all
的指针。由于您在每个步骤修改h
,因此每次都会在h_all
中放置相同的指针。最后,h_all
会在每个广告位中显示h
的当前值。
这是处理Python列表和词典时的常见问题。你必须在迭代的每一步附加一个副本,而不是一个可变对象。
为了澄清这一点,请查看id(h_all[0])
和id(h_all[1])
;我希望他们是一样的。或者在循环后尝试h +=1
,并观看h_all
值的变化。
我应该补充说,如果h[:]
是一个列表,h
会创建一个副本,但如果它是一个数组则不会创建副本。