首页 > 解决方案 > 如何在循环中获取列表对象的内容而不是列表对象本身?

问题描述

a = [[-5.0, 5.0, 0], 
     [-4.0, 5.0, 0],  
     [-3.0, 5.0, 0]]

这是我的清单。但我想在这里得到这样的列表。

b = [[-5.0, 5.0, 0],  
     [-4.0, 5.0, 0],  
     [-3.0, 5.0, 0],
     [-5.0, 5.0, 1],  
     [-4.0, 5.0, 1], 
     [-3.0, 5.0, 1],
     [-5.0, 5.0, 2], 
     [-4.0, 5.0, 2], 
     [-3.0, 5.0, 2]]

这是我的代码。

for x in np.arange(0,3,1):
    for y in range(len(a)):
        a[y][2]=x
        b.append(a[y])

但是这段代码的输出是:

b = [[-5.0, 5.0, 2], 
     [-4.0, 5.0, 2], 
     [-3.0, 5.0, 2], 
     [-5.0, 5.0, 2], 
     [-4.0, 5.0, 2],
     [-3.0, 5.0, 2], 
     [-5.0, 5.0, 2],
     [-4.0, 5.0, 2], 
     [-3.0, 5.0, 2]] 

那么我的代码有什么问题?如何修改它以获得正确的结果?

标签: pythonnumpy

解决方案


如果您坚持使用列表,对您的代码的简单修复是:

for x in np.arange(0,3,1):
    for y in range(len(a)):
        a[y][2]=x
        b.append(a[y].copy())

输出:

[[-5.0, 5.0, 0], [-4.0, 5.0, 0], [-3.0, 5.0, 0], [-5.0, 5.0, 1], [-4.0, 5.0, 1], [-3.0, 5.0, 1], [-5.0, 5.0, 2], [-4.0, 5.0, 2], [-3.0, 5.0, 2]]

解释

a[y]是一个列表。当您将其附加到 时b,您将附加列表对象,而不仅仅是其内容。然后,在您的下一次迭代中,您更改a[y][2]. 这将改变原始a内容(其中的最后一个索引),这反过来也会改变b。因此最后,所有a的 inb都会改变,因为它们都指向同一个列表对象。要更好地理解这一点,请查看此代码如何更改值。

a = [1,2,3]
b = a
a[2] = 10
print(b)

乙:

[1, 2, 10]

当你改变时ab也会改变,因为它们都指向同一个列表对象,改变一个会改变另一个(它们实际上是同一个对象)。

现在,如果您要分配内容而不是对象,则需要对其进行复制:

a = [1,2,3]
b = a.copy()
a[2] = 10
print(b)

乙:

[1, 2, 3]

但是,如果您不需要使用列表,我建议您使用 numpy 数组。


推荐阅读