【问题标题】:Why do some arrays mirror each other in PowerShell?为什么某些数组在 PowerShell 中相互镜像?
【发布时间】:2018-11-06 06:31:02
【问题描述】:

我正在使用 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} 都实现了完全相同的目标。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    它被称为“通过引用”。您不是实际分配值,而是分配对另一个保存值的位置的引用。如果原始位置中的值发生更改,则您所做的引用指向该原始位置,并且将看到更新后的值。

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

    在 PowerShell 中,您还可以将 .value 放在引用后面以获取值,而不是引用。

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2022-09-16
        • 2021-06-05
        • 2012-08-22
        相关资源
        最近更新 更多