powershell数组清除方法和赋值



赋值运算符="将变量的值设置为指定值",如参考文档中所述。毫不奇怪,之前分配给另一个变量的变量(在我的例子中是一个数组)的更改不会影响后一个的值。

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就不会被清除。

我清醒了吗?

最新更新