我正在使用PowerShell 2.0。当我将一个新变量作为一个数组,然后将另一个变量设置为等于第一个变量时,第二个变量"镜像"第一个。更改原始数组中的对象后,第二个数组中将出现完全相同的更改。例如,
$array0001 = 6, 7, 3, 4, 0
$array0002 = $array0001
$array0001[3] = 55
$array0002
输出为
6
7
3
55
0
我注意到当你将第二个变量设置为与第一个变量具有相同的值时,除了包含在子表达式运算符中的时间之外,对第一个数组的修改不会影响第二个数组。例如,
$array0001 = 6, 7, 3, 4, 0
$array0002 = $($array0001)
$array0001[3] = 55
$array0002
输出为
6
7
3
4
0
为什么将值包含在子表达式运算符中会改变变量的行为?是否有另一种或更好的方法来避免产生数组变量"镜像"彼此?
ETA:我现在发现$array0002 = @($array0001)
和$array0002 = &{$array0001}
都达到了完全相同的目标。
答案 0 :(得分:7)
它被称为"通过引用传递"。您不是实际分配值,而是将引用分配给另一个包含值的位置。如果原始位置中的值发生更改,则您所做的引用将指向该原始位置,并将显示更新的值。
大多数语言都有通过引用传递的方式" "传递价值"。这是你通过rpmbuild -ba foo.spec
找到的。没有一个比另一个好,它们都有不同的用途。
在PowerShell中,您还可以将$array0002=$($array0001)
置于引用后面以获取值,而不是引用。
答案 1 :(得分:2)
当设置一个等于另一个的数组时,不同的变量只是引用彼此,它不是真正的副本。 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()