赋值运算符= 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上进行了测试。
答案 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
顺便说一句,您可以更经常地满足以下条件:值类型,引用类型和指针类型……