首页 > 解决方案 > 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) 一样工作。

标签: pythonlistset

解决方案


你有一个别名问题。当你这样做时,你正在共享一个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()]]

推荐阅读