为什么某些阵列在PowerShell中相互镜像?

sin*_*677 5 powershell

我正在使用PowerShell 2.0.当我将一个新变量作为一个数组,然后将另一个变量设置为等于第一个变量时,第二个变量"镜像"第一个变量.更改原始数组中的对象后,第二个数组中将出现完全相同的更改.例如,

$array0001 = 6, 7, 3, 4, 0
$array0002 = $array0001
$array0001[3] = 55
$array0002
Run Code Online (Sandbox Code Playgroud)

输出是

6
7
3
55
0
Run Code Online (Sandbox Code Playgroud)

我注意到当你将第二个变量设置为与第一个变量具有相同的值时,除了包含在子表达式运算符中的时间之外,对第一个数组的修改不会影响第二个数组.例如,

$array0001 = 6, 7, 3, 4, 0
$array0002 = $($array0001)
$array0001[3] = 55
$array0002
Run Code Online (Sandbox Code Playgroud)

输出是

6
7
3
4
0
Run Code Online (Sandbox Code Playgroud)

为什么将值包含在子表达式运算符中会改变变量的行为?是否有另一种或更好的方法可以避免使数组变量相互"镜像"?

ETA:我现在已经发现$array0002 = @($array0001)并且$array0002 = &{$array0001}两者都达到了完全相同的目标.

coi*_*ird 7

它被称为"通过引用传递".您不是实际分配值,而是将引用分配给另一个包含值的位置.如果原始位置中的值发生更改,则您所做的引用将指向该原始位置,并将显示更新的值.

大多数语言都有"通过引用传递"和"按值传递"的方法.这就是你通过做的发现$array0002=$($array0001).没有一个比另一个好,它们都有不同的用途.

在PowerShell中,您还可以放置.value引用以获取值,而不是引用.