赋值运算符="将变量的值设置为指定值",如参考文档中所述。毫不奇怪,之前分配给另一个变量的变量(在我的例子中是一个数组)的更改不会影响后一个的值。
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(),或者其他比有人建议的更好的方法。
但我的问题是:
如何解释clear方法对$V的影响对另一个数组$A的"传播"?
已对PS版本5.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
有关解释,请阅读复制数组和哈希表:
将数组或哈希表从一个变量复制到另一个变量是有效的,但是可能会产生意外结果。原因是数组和散列表不是直接存储在变量中,变量总是只存储单个值。当您使用数组和哈希表时处理对数组或哈希表的引用。所以,如果你将一个变量的内容复制到另一个变量,只有引用复制的,而不是数组或哈希表。这可能导致以下意外行为:
$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
BTW,您可以更频繁地满足值类型、引用类型针类型
对我来说,你看到的是正常的,我试着解释自己:
$V="a", "b", "c"
$a = $V
现在CCD_ 6包含与CCD_ 7相同的引用。如果清除$V
,则清除$a
。
现在,如果你写$V = "b","c"
,你会用一个新选项卡的引用来影响$V
。这个引用与你对$a
的引用不同。所以现在如果清除$V
,$a
就不会被清除。
我清醒了吗?