2012-01-09 354 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