我正在尝试二维数组。我想要某种具有相同字符的矩阵。我可以定义一个带有固定元素的空白多维数组,并使用循环为它提供一个字符。但是,我也可以执行@(something)*n
来直接定义已经提供了一些东西的数组。
根据我到目前为止的了解,这是怎么做的:
> $arr = ,(,'E'*3)*3
这些似乎还不错:
> $arr[1]
E
E
E
> $arr[1][2]
E
但是,当我尝试在某处替换字符(例如
$arr[1][2] = 'D'
)时,将替换许多字符:> $arr
E
E
D
E
E
D
E
E
D
我的数组定义错误吗?补充:那么,如何正确地“快速”定义它?
最佳答案
在非数字值上使用*
运算符可创建原始值的副本。但是,如果您要复制的项目不是String或Char之类的原始(-ish)类型,则结果将不是该对象的重复项,而是对象引用的副本。由于所有实例都将指向同一对象,因此更改一个实例将全部更改。
要创建不同的实例,您需要在循环中重复数组实例化,如PetSerAl在注释中所示:
$arr = 1..3 | ForEach-Object { ,(,'E' * 3) }
在这种特殊情况下,您还可以创建一个"template"数组并将其克隆:
$a0 = ,'E' * 3
$arr = 1..3 | ForEach-Object { ,$a0.Clone() }
但是请注意,克隆对象将而不是克隆嵌套的对象引用,因此后者并不是在所有情况下都可行的方法。
这样的事情将无法按您的预期方式工作(因为在克隆数组对象后,嵌套哈希表对象的引用仍指向相同的实际哈希表):
PS C:\> $ a0 =([PSCustomObject] @ {'x'='E'}),([[PSCustomObject] @ {'x'='E'})
PS C:\> $ arr = 1..2 | ForEach-Object {,$ a0.Clone()}
PS C:\> $ arr
X
--
Ë
Ë
Ë
Ë
PS C:\> $ arr [1] [1] .x ='F'
PS C:\> $ arr
X
--
Ë
F
Ë
F
但是这样的事情会起作用:
PS C:\> $ arr = 1..2 | ForEach-Object {,((([PSCustomObject] @ {'x'='E'}),([PSCustomObject] @ {'x'='E'}))}
PS C:\> $ arr
X
--
Ë
Ë
Ë
Ë
PS C:\> $ arr [1] [1] .x ='F'
PS C:\> $ arr
X
--
Ë
Ë
Ë
F
关于arrays - 相同字符的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453191/