2012-01-09 199 views
5

我有一个程序创建一个数组,然后试图将该数组的值多次分配到另一个数组作为多维数组的示例。Powershell数组赋值赋值变量,而不是值?

$a [email protected](0,0,0) 
$b = @($a,$a,$a) 
$b[1][2]=2 
$b 
'And $a is changed too:' 
$a 

输出是:

PS E:\Workarea> .\what.ps1 
0 
0 
2 
0 
0 
2 
0 
0 
2 
And $a is changed too: 
0 
0 
2 

所以在这种情况下,实际上为变量指向原来的变量。这是非常意想不到的行为。尽管我从来没有在C编程中使用过多的工会,但是可以做到这一点非常简洁。但我想要一种方法来实际上只做值的分配,而不是变量的分配。

$b = @($a.clone(),$a.clone(),$a.clone()) 

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

感谢您的意见。

这是Windows 7 64位下的PowerShell 2.0。

回答

4

要将$a的值分配给$b而不是对$a的引用,可以将该变量包装在$()中。在命令中使用它之前,$()中的任何内容都会被评估,因此$($a)相当于0, 0, 0

$a [email protected](0,0,0) 
$b = @($($a),$($a),$($a)) 
$b[1][2]=2 
$b 
'$a is not changed.' 
$a 
+0

谢谢。这样可行。 我只是不明白为什么一个$ a = $ b的实例给你的价值,另一个实例给你的参考。特别是当不能保证你会得到$ b可能是任何东西的时候。 – bytehead 2012-01-09 21:02:13

+2

这不是特定于PowerShell的;它是如何处理类(通过引用)与结构(按值)的内存分配。数值(int,double等)也是按值计算的。在http://www.albahari.com/valuevsreftypes.aspx有一个很好的解释。并从微软http://msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx – Rynant 2012-01-09 21:50:15

+0

谢谢。在堆上更多的阅读。 – bytehead 2012-01-10 03:39:02

1

在PowerShell'小心',不是枚举运算符,而是数组aoperator。你表现为多维数组实际上是数组的数组的东西,你会发现这里多维数组的定义中:

$a= new-object ‘object[,]’ 3,3 
$a[0,2]=3 
PS > for ($i=0;$i -lt 3;$i++) 
>> { 
>> for($j=0;$j -lt 3;$j++) 
>> { 
>> $a[$i,$j]=$i+$j 
>> } 
>> } 

一切工作,这里$b是引用数组。

+0

我试图使用真正的多维数组,但是当我尝试使用它们时,它们正在翻转鸟。显然,我仍然有办法去学习这些细节。一组数组适用于我正在做的事情,实际上,我正在考虑只使用平面数组。 – bytehead 2012-01-09 21:12:20

+0

一组数组适用于我正在做的事情。从前C程序员,一维,二维,阵列数组,对我来说都是一样的。 这仍然有分配给$ b的问题。它仍然是参考。使用$ b = $($ a),然后$ b [0,2] = 3给我的数组赋值为[0,2]失败,因为不支持对切片的赋值。错误。 这不会发生在我的例子中。 我讨厌输入只是添加评论,而五分钟的窗口编辑很烂。只是说。 N00b在这里。 – bytehead 2012-01-09 21:20:59