Python 为列表、标识分配值

Python 为列表、标识分配值,python,list,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,

这个问题很简单,但这给我带来了麻烦

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

问题在这里:

 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))]
问题在于:

 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

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

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

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

中,因为您没有向我们显示您实际使用的代码<代码>对于len(a)中的i:永远不会运行。向我们展示真实的代码,展示您所询问的行为,否则我们找不到您的bug是否真的需要三重嵌套列表?我正在尝试复制您的错误。此外,没有必要像您在
b=[[0.0]*len(a[0])]*len(a)
中那样初始化列表b。只需使用
b.append()
事实上,缺少一个“范围”,谢谢。您没有向我们显示您实际使用的代码<代码>对于len(a)中的i:永远不会运行。向我们展示真实的代码,展示您所询问的行为,否则我们找不到您的bug是否真的需要三重嵌套列表?我正在尝试复制您的错误。此外,没有必要像您在
b=[[0.0]*len(a[0])]*len(a)
中那样初始化列表b。只需使用
b.append(),问题是我重新使用了我发布的代码,但效果很好。不管怎样,这没关系,谢谢。你的建议实际上解决了这个问题,问题是我重新使用了我发布的代码,但效果很好。不管怎样,这没关系,谢谢。