python - Python:将值分配给元素被设置的二维列表数组
问题描述
设 a 是一个二维列表,每个元素都是一个集合。比如设a为(3,3)列表,我初始化如下
a = [set()] * 3
a = [a] * 3
我现在想将 a[1][1] 分配给另一组。我愿意
a[1][1] = set([1,2,3])
但在这样做时,不仅 a[1][1],而且 a[0][1] 和 a[2][1] 都被分配给这个新集合。这对我来说太奇怪了。这是怎么发生的?我应该如何纠正它?
谢谢!!
我将 a 设置为二维列表数组,因为我希望 a 像 Matlab 中的 a = cell(3,3) 一样工作。
解决方案
你有一个别名问题。当你这样做时,你正在共享一个list
对象
a = [a] * 3
then 的每个索引都a
引用相同的list
. 您有 3 个list
对象都引用同一个对象。
您可以通过执行以下操作看到这与set
结构无关:
a = [set()] * 3
a = [a] * 3
print(a)
a[1][1] = "Test"
print(a)
输出:
[[set(), set(), set()], [set(), set(), set()], [set(), set(), set()]]
[[set(), 'Test', set()], [set(), 'Test', set()], [set(), 'Test', set()]]
你应该是这样的:
a = [[set() for _ in range(3)] for _ in range(3)]
print(a)
a[1][1] = {1, 2, 3}
print(a)
为了确保你有不同list
的 s 所以你不会有这个问题。
你也可以这样做:
a = [[set()] * 3 for _ in range(3)]
print(a)
a[1][1] = {1, 2, 3}
print(a)
两者都产生相同的输出:
[[set(), set(), set()], [set(), set(), set()], [set(), set(), set()]]
[[set(), set(), set()], [set(), {1, 2, 3}, set()], [set(), set(), set()]]
推荐阅读
- c# - 仅在普通 Razor MVC 视图中使用 Blazor Wasm 但不使用 SPA
- python - 如何使用 python 从 xcrun xctrace list devices 获取设备?
- pyspark - 处理结构化流数据块中的重复项 [PySpark]
- c++ - 如何在 vscode 中包含其他 c++ 头文件?
- git - 具有相同标签的多个提交
- linux - Cron 作业不工作的原因是什么?
- discord.js - Discordjs 和突击队
- go - 如何让 gocolly 爬行变慢
- python - 使用 Apache Beam Python SDK 将文件写入 Parquet 中的动态目标
- sql - SQL - 填写范围之间的值