Powershell数组赋值赋值变量,而不是值?

byt*_*ead 5 arrays powershell variable-assignment

我有一个创建数组的程序示例,然后尝试将该数组的值多次分配到另一个数组中作为多维数组.

$a =@(0,0,0)
$b = @($a,$a,$a)
$b[1][2]=2
$b
'And $a is changed too:'
$a
Run Code Online (Sandbox Code Playgroud)

输出是:

PS E:\Workarea> .\what.ps1
0
0
2
0
0
2
0
0
2
And $a is changed too:
0
0
2
Run Code Online (Sandbox Code Playgroud)

所以在这个例子中,变量实际上指向原始变量.这是非常意外的行为.虽然我从来没有在C编程中使用过很多工会,但是人们可以做到这一点相当简洁.但我想要一种方法来实际只是分配值,而不是变量.

$b = @($a.clone(),$a.clone(),$a.clone())
Run Code Online (Sandbox Code Playgroud)

我想会工作,但有些东西告诉我,可能会有一些比这更优雅的东西.

感谢您的投入.

这是Windows 7 64位下的PowerShell 2.0.

Ryn*_*ant 5

要分配$ato的值$b而不是对 的引用$a,您可以将变量包装在 中$()。中的任何内容在$()命令中使用之前都会进行评估,因此$($a)等效于0, 0, 0.

$a =@(0,0,0)
$b = @($($a),$($a),$($a))
$b[1][2]=2
$b
'$a is not changed.'
$a
Run Code Online (Sandbox Code Playgroud)

  • 这不是 PowerShell 特有的;它是 .NET 处理类(通过引用)与结构(通过值)的内存分配的方式。数值(int、double 等)也是按值计算的。http://www.albahari.com/valuevsreftypes.aspx 上有很好的解释。来自微软 http://msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx (2认同)