python - 如何在循环中获取列表对象的内容而不是列表对象本身?
问题描述
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]]
那么我的代码有什么问题?如何修改它以获得正确的结果?
解决方案
如果您坚持使用列表,对您的代码的简单修复是:
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]
当你改变时a
,b
也会改变,因为它们都指向同一个列表对象,改变一个会改变另一个(它们实际上是同一个对象)。
现在,如果您要分配内容而不是对象,则需要对其进行复制:
a = [1,2,3]
b = a.copy()
a[2] = 10
print(b)
乙:
[1, 2, 3]
但是,如果您不需要使用列表,我建议您使用 numpy 数组。
推荐阅读
- datadog - datadog montiors 如何查询比率
- r - 读取数据帧直到 R 中的特定行
- postgresql - 在 postgresql 中开始隔离级别
- .net-core - Aspnet 样板招摇内部服务器错误?
- javascript - 选项属性在 Chart.js 中不起作用
- python - 自定义张量流模型上的 InvalidArgumentError
- xamarin - Xamarin 表单 carouselview 滚动带有多个项目的单个滚动
- javascript - jQuery On Change 方法不起作用
- git - 如何将 gitlab 存储库同步到自动使用 ssh 的远程服务器
- node.js - 如何使用 Node js 将文件正确上传到 OneDrive?无需前端身份验证即可获取访问令牌