克隆多维数组
Cloning multidimensional arrays
我想将多维数组 @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这两个数组绑定了?
问题:
- 为什么数组@a绑定到数组@b(克隆的目的是什么
这种情况下的方法?我们知道克隆的行为符合预期
一维数组)
- 我怎样才能真正将@a 克隆到@b(多维)?
- 哪种方法最有效(有时间限制)?
您拥有的不是多维数组,而是数组的数组。由于 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]]
作为最后的清理,您还可以 "pour" 一个概念上无限的 0
序列到数组中以对其进行初始化:
my @a[3;3] Z= 0 xx *;
也就是说右边的3x3结构不需要复制
@a
和 @b
未 绑定 。它们只是碰巧包含相同的东西。 clone
不递归,只克隆外部数组。
一种实现您想要的方法是
@b = @a.map: *.clone;
我想将多维数组 @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这两个数组绑定了?
问题:
- 为什么数组@a绑定到数组@b(克隆的目的是什么 这种情况下的方法?我们知道克隆的行为符合预期 一维数组)
- 我怎样才能真正将@a 克隆到@b(多维)?
- 哪种方法最有效(有时间限制)?
您拥有的不是多维数组,而是数组的数组。由于 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]]
作为最后的清理,您还可以 "pour" 一个概念上无限的 0
序列到数组中以对其进行初始化:
my @a[3;3] Z= 0 xx *;
也就是说右边的3x3结构不需要复制
@a
和 @b
未 绑定 。它们只是碰巧包含相同的东西。 clone
不递归,只克隆外部数组。
一种实现您想要的方法是
@b = @a.map: *.clone;