为什么list.append在";至于;不同级别的循环
为什么会这样?我必须使用numpy.array的副本吗?但是 它似乎与第一个代码一起工作。不知道为什么为什么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中放置相同
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])
不相同(对于两个代码)2h+=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[:])