为什么list.append在具有不同级别的“for”循环中表现不同

时间:2016-02-23 21:39:51

标签: list for-loop numpy append

为什么会这样?我是否必须使用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.]])]

1 个答案:

答案 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会创建一个副本,但如果它是一个数组则不会创建副本。