在Python中编辑多维数组

STU*_*STU 2 python arrays multidimensional-array

我对多维Python"数组"(实际上是列表列表,而不是numpy数组)的行为有点困惑.假设我有一个4 x 4阵列,其条目是1 x 2阵列(也就是说,4 x 4阵列的条目是包含2个列表的列表).我可以使用以下命令初始化这样一个空数组:

b = [[[[], ]*2, ]*4, ]*4
Run Code Online (Sandbox Code Playgroud)

这将创建以下多维空数组:

[[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]]]
Run Code Online (Sandbox Code Playgroud)

现在我想修改这个4 x 4阵列的单个条目; 例如,我想使组件b[0][0]等于[[1],[2]]:

[[[[1], [2]], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]],
[[[], []], [[], []], [[], []], [[], []]]]
Run Code Online (Sandbox Code Playgroud)

我的期望是以下命令可以完成这项工作:

b[0][0] = [[1],[2]]
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下矩阵b:

[[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]],
[[[1], [2]], [[], []], [[], []], [[], []]]]
Run Code Online (Sandbox Code Playgroud)

实现这个目标的正确方法是什么?

Mig*_*ork 6

当你这样做时,问题确实存在

b = [[[[], ]*2, ]*4, ]*4
Run Code Online (Sandbox Code Playgroud)

您正在复制对相同数组的引用,因此新的大型多维数组包含对同一数组的许多引用.

这是iPython的一个例子:

In [22]: a = [[],]*10

In [23]: a
Out[23]: [[], [], [], [], [], [], [], [], [], []]

In [24]: a[1].append(12)

In [25]: a
Out[25]: [[12], [12], [12], [12], [12], [12], [12], [12], [12], [12]]
Run Code Online (Sandbox Code Playgroud)

为了更好地创建阵列,请转到此处

可能解决您想要的问题:

m = [[[[] for x in range(2)] for x in range(4)] for x in range(4)]
Run Code Online (Sandbox Code Playgroud)