2017-06-08 8 views
5

Używam Powershell 2.0. Kiedy utworzę nową zmienną jako tablicę, a następnie ustawię inną zmienną tak, aby była równa pierwszej, druga zmienna "odzwierciedla" pierwszą zmienną. Po zmianie obiektu w oryginalnej tablicy, ta sama zmiana pojawia się w drugiej tablicy. Na przykład,Dlaczego niektóre tablice lustrzane siebie w Powershell

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

z wyjściem będąc

6 
7 
3 
55 
0 

Zauważyłem, że po ustawieniu drugą zmienną mieć taką samą wartość jak pierwszej zmiennej, ale tym razem zamkniętym wewnątrz operatora podwyrażenie, modyfikacje do pierwszej tablicy nie wpływa na drugą tablicę. Na przykład,

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

z wyjściem będąc

6 
7 
3 
4 
0 

Dlaczego załączając wartość zmianą operatora podwyrażenie zachowanie zmiennej? Czy istnieje inny lub lepszy sposób uniknięcia tworzenia zmiennych tablicowych, które "lustrują się" nawzajem?

ETA: Zauważyłem, że zarówno [email protected]($array0001), jak i $array0002=&{$array0001} osiągają dokładnie ten sam cel.

Odpowiedz

7

Nazywa się "Przekaż jako odniesienie". Zamiast przypisywać wartość, przypisujesz odwołanie do innej lokalizacji, która ma wartość. Jeśli wartość w pierwotnej lokalizacji ulegnie zmianie, utworzona referencja wskazuje na tę oryginalną lokalizację i wyświetli zaktualizowaną wartość.

Większość języków ma sposoby "przekazywania według referencji" i "przekazywania według wartości". To właśnie znalazłeś wykonując $array0002=$($array0001). Żadne z nich nie jest lepsze od drugiego, obaj mają różne zastosowania.

W PowerShell można również wstawić za referencją .value, aby pobrać wartość zamiast odniesienia.

2

Po ustawieniu jednej tablicy równej innej, różne zmienne po prostu odwołują się do siebie nawzajem, to nie jest prawdziwa kopia. This to w zasadzie to samo, o co pytasz. Z tego linku porządkowanie danych w celu wykonania głębokiej kopii jest dobrym sposobem obejścia tego.

#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() 
Powiązane problemy