简单的问题,但这给了我麻烦。
我有一个包含里面列表的列表,可以是一个带有两个变量的函数,比如x,y和结果,z,所以列表就像
一样构建a = [ [[x1,y1,z11], [x1,y2,z12], ...],
[[x2,y1,z21], [x2,y2,z22], ...],
... ]
现在,我想构建另一个具有不同功能的对象,比如w:
b = [ [[x1,y1,w11], [x1,y2,w12], ...],
[[x2,y1,w21], [x2,y2,w22], ...],
... ]
然后,要做到这一点,我这样做:
b = [[0.0]*len(a[0])]*len(a)
for i in range(len(a)):
for j in range(len(a[0])):
c = a[i][j][:2]
c.append(w(i,j))
b[i][j] = c
确定。现在,当我要求a[i][j]
时,我得到b[i][j]
。这让我感到困惑,因为当我在终端尝试这个时,我得到了正确的a[i][j]
。有什么帮助吗?
答案 0 :(得分:4)
问题在于:
b = [[0.0]*len(a[0])]*len(a)
# or in two steps
x = [0.0] * len(a[0]) # one list
b = [x] * len(a) # lots of references to that same list
您需要做的是新列表:
# makes a new inner list for every m
b = [[0.0]*len(a[0]) for m in xrange(len(a))]
答案 1 :(得分:0)
问题是,c = a[i][j][:2]
为您提供a
中实际列表的引用。当您向其添加内容时,您正在修改a
。相反,只需写
c = a[i][j][:2] + [ w(i, j) ]
现在c
是一个不同的列表,您可以安全地将其保存在b