Powershell阵列清除方法和分配

时间:2019-02-09 15:12:59

标签: arrays powershell variable-assignment

赋值运算符= reference doc中所说的“将变量的值设置为指定值”。毫不奇怪,先前已分配给另一个变量的变量(在我的情况下为数组)的更改不会影响后一个变量的值。

    PS C:\> $V="a", "b", "c"
    PS C:\> $A=$V
    PS C:\> write-host "A before new value of V: $A"
    A before new value of V: a b c
    PS C:\> $V="e","f"
    PS C:\> write-host "A after new value of V: $A"
    A after new value of V: a b c
    PS C:\>  

但是当使用方法clear()时,行为似乎有所不同。

PS C:\> $V="a", "b", "c"
PS C:\> $A=$V
PS C:\> write-host "A before clearing V: $A"
A before clearing V: a b c
PS C:\> $V.clear()
PS C:\> write-host "A after clearing V: $A"
A after clearing V: 
PS C:\>  

应用于$ V的clear()方法似乎也作用于$ A。好像分配是通过引用进行的,很奇怪,仅适用于此方法。实际上,如果在清除后将新值分配给$ V,则$ A仍然仅受清除影响。

PS C:\> $V="a", "b", "c"
PS C:\> $A=$V
PS C:\> write-host "A before clearing V: $A"
A before clearing V: a b c
PS C:\> $V.clear()
PS C:\> $V="e","f"
PS C:\> write-host "A after clearing V: $A"
A after clearing V:   
PS C:\>  

可以避免这种影响,尽管并不完全相同:$ A = $ V.clone()或使用cmdlet Clear-Variable -name V或$ V = $ null代替$ V.clear()或其他人比别人建议的要好。

但是我的问题是:
如何解释清除方法对$ V到其他数组$ A的“传播”?

已经在PS版本5.1上进行了测试。

2 个答案:

答案 0 :(得分:1)

对我来说,您所看到的是正常的,我尝试向自己解释一下:

$V="a", "b", "c"
$a = $V

现在$a包含与$V相同的引用。如果清除$V,则$a也将清除。

现在,如果您编写$V = "b","c",则会通过引用新标签影响$V。并且此引用与您对$a的影响不同。因此现在清除$V不会清除$a

我清楚了吗?

答案 1 :(得分:1)

使用Clone()方法获取数组的 true 副本。

$V = "a", "b", "c"
$A = $V.Clone()
Write-Host "A before new value of V: $A"
$V = "e","f"
Write-Host "A after  new value of V: $A"
A before new value of V: a b c
A after  new value of V: a b c

有关说明,请阅读Copying Arrays and Hash Tables

  

将数组或哈希表从一个变量复制到另一个变量,但是   可能会产生意想不到的结果。原因是数组和哈希   表不直接存储在变量中,变量始终只存储一个   单值。当使用数组和哈希表时,   处理对数组或哈希表的引用。所以,如果你   复制一个变量的内容到另一个,只有引用将   复制,而不是数组或哈希表。这可能会导致   以下意外行为:

$array1 = 1,2,3
$array2 = $array1
$array2[0] = 99
$array1[0]
99
     

尽管在此示例中$array2的内容已更改,但是   也影响$array1,因为它们都是相同。的   变量$array1$array2在内部引用相同   存储区。因此,如果您想创建一个副本,   复制数组或哈希表,

$array1 = 1,2,3
$array2 = $array1.Clone()
$array2[0] = 99
$array1[0]
1
     

无论何时将新元素添加到数组(或哈希表)或删除   现有的,复制动作会自动在   背景及其结果存储在新的数组或哈希表中。   以下示例清楚地说明了后果:

# Create array and store pointer to array in $array2:
$array1 = 1,2,3
$array2 = $array1

# Assign a new element to $array2. A new array is created in the process and stored in $array2:
$array2 += 4
$array2[0]=99

# $array1 continues to point to the old array:
$array1[0]
1

顺便说一句,您可以更经常地满足以下条件:值类型引用类型指针类型……