将值分配给列表,标识

时间:2012-03-02 16:01:08

标签: python list

简单的问题,但这给了我麻烦。

我有一个包含里面列表的列表,可以是一个带有两个变量的函数,比如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]。有什么帮助吗?

2 个答案:

答案 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