2017-06-08 5 views
5

Powershell 2.0を使用しています。新しい変数を配列として作成し、別の変数を最初の変数と同じに設定すると、2番目の変数は最初の変数を「反映」します。元の配列内のオブジェクトを変更すると、まったく同じ変更が2番目の配列に表示されます。例えば、Powershellでいくつかのアレイが互いにミラーリングする理由

$array0001=6,7,3,4,0 
$array0002=$array0001 
$array0001[3]=55 
$array0002 

出力は、私はあなたが部分式演算子内に封入され、この時以外は、第一の変数と同じ値を有する第2の変数を設定することがわかり

6 
7 
3 
55 
0 

、修正された状態で最初の配列には影響しません。例えば、出力が

6 
7 
3 
4 
0 

なぜ部分式演算子の値を囲むんであると

$array0001=6,7,3,4,0 
$array0002=$($array0001) 
$array0001[3]=55 
$array0002 

変数の動作を変更しますか?お互いに "ミラーリング"する配列変数を作ることを避けるために、他にも良い方法がありますか?

ETA:私は今、[email protected]($array0001)$array0002=&{$array0001}の両方が全く同じ目的を達成していることを発見しました。

答えて

7

"参照渡し" と呼ばれています。実際に値を割り当てる代わりに、値を保持する別の場所への参照を割り当てます。元の場所の値が変更された場合、作成した参照はその元の場所を指しており、更新された値が表示されます。

ほとんどの言語には、「参照渡し」と「値渡し」の方法があります。それは$array0002=$($array0001)を実行して見つけたものです。どちらも他のものよりも優れているわけではなく、どちらも用途が異なります。

PowerShellでは、参照の代わりに.valueを参照の後に置き、値を取得することもできます。

2

このように1つの配列を別の配列に設定すると、異なる変数は単に相互を参照しているだけで、真のコピーではありません。 Thisは本質的にあなたが求めているのと同じものです。そのリンクから、ディープ・コピーを行うためにデータをシリアライズするのが良い方法です。

#Original data 
$Array1 

# Serialize and Deserialize data using BinaryFormatter 
$ms = New-Object System.IO.MemoryStream 
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
$bf.Serialize($ms, $Array1) 
$ms.Position = 0 

#Deep copied data 
$Array2 = $bf.Deserialize($ms) 
$ms.Close() 
関連する問題