为什么list.append在";至于;不同级别的循环

为什么list.append在";至于;不同级别的循环,list,for-loop,numpy,append,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 它给 哪个好 但如果我编码为 在h_all列表中放置指向h的指针。由于在每个步骤中都要修改h,因此每次都会在h\u all中放置相同

为什么会这样?我必须使用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
它给

哪个好 但如果我编码为

h_all
列表中放置指向
h
的指针。由于在每个步骤中都要修改
h
,因此每次都会在
h\u all
中放置相同的指针。最后,
h_all
显示每个插槽中
h
的当前值

在处理Python列表和字典时,这是一个常见问题。您必须在迭代的每一步追加一个副本,而不是一个可变对象

要澄清这一点,请查看
id(h_all[0])
id(h_all[1])
;我想他们是一样的。或者在循环后尝试
h+=1
,观察
h\u all
的值的变化


我应该补充一点,
h[:]
如果
h
是一个列表,就创建一个副本,但如果它是一个数组,就不会创建副本。

谢谢@hpaulj的帮助。以下是后续内容:1第二个代码的
id(h_all[0])
id(h_all[i])
不相同(对于两个代码)2
h+=1
确实会更改
h_all
中的所有
h
,但不会影响第一个代码的
h_all
结果。3在第一个代码中,为什么h不像在第二个代码中那样充当指针?我忘了
h[:]
生成数组的
视图。这是一个新对象,但它共享底层数据。因此,
id
在每次迭代中都会有所不同;但这些价值观是共同的
h.copy()
需要在这样的迭代中使用。
[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.]])]
for k in range(0, n):
    ....
    h_all.append(h[:])