给列表赋值,标识

2024-06-25 05:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

简单的问题,但这给我带来了麻烦。你知道吗

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


Tags: 对象函数in列表forlenrangex1
2条回答

问题在于:

 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))]

问题是c = a[i][j][:2]提供了对a中实际列表的引用。当您向它附加某些内容时,您正在修改a。相反,只要写下来

c = a[i][j][:2] + [ w(i, j) ]

现在c是一个不同的列表,您可以安全地将其保存在b

相关问题 更多 >