我想将多维数组@a克隆到数组@b。
我采用了最直观的方法,并提出了以下建议:
my @a = [0, 0, 0], [0, 0, 0], [0, 0, 0];
my @b = @a.clone;
@a[0][1] = 1;
@b[1][0] = 1;
say '@a : ' ~ @a.gist;
say '@b : ' ~ @b.gist;
打印输出为:
@a : [[0 1 0] [1 0 0] [0 0 0]]
@b : [[0 1 0] [1 0 0] [0 0 0]]
这意味着两个数组@a和@b绑定了吗?
问题:
1. Why array @a is binded to array @b (What is the purpose of the clone method in this situation? We know that clone behave as intented for one-dimensional arrays)
2.
2.1 How can I really clone @a to @b (multidimensional)?
2.2 Which is the most efficient way (time bounded) to do that?
您拥有的不是多维数组,而是数组的数组。由于clone
较浅,因此仅复制顶层数组。在这种情况下,clone
也是多余的,因为分配给数组已经是复制操作。
一个简单的解决方法是克隆每个嵌套数组:
my @b = @a.map(*.clone);
或者,您可以使用真实的多维数组。该声明将如下所示:
my @a[3;3] = [0, 0, 0], [0, 0, 0], [0, 0, 0];
然后复制到另一个数组将是:
my @b[3;3] = @a;
分配也需要更新以使用多维语法:
@a[0;1] = 1;
@b[1;0] = 1;
最后,它的结果:
say '@a : ' ~ @a.gist;
say '@b : ' ~ @b.gist;
根据需要:
@a : [[0 1 0] [0 0 0] [0 0 0]]
@b : [[0 0 0] [1 0 0] [0 0 0]]
作为最后的清理,您还可以将概念上无限的0
序列“倒入”数组中以对其进行初始化:
my @a[3;3] Z= 0 xx *;
这意味着不需要在右侧复制3x3结构。
@a
和@b
不是bound。它们恰好包含相同的东西。 clone
不递归,仅克隆外部Array。
实现您想要的目标的一种方法是
@b = @a.map: *.clone;