Arrays powershell数组清除方法和分配
赋值运算符=“将变量的值设置为指定值”,如中所述。毫不奇怪,先前分配给另一个变量的变量(在我的例子中是数组)的更改不会影响后一个变量的值Arrays powershell数组清除方法和分配,arrays,powershell,variable-assignment,Arrays,Powershell,Variable Assignment,赋值运算符=“将变量的值设置为指定值”,如中所述。毫不奇怪,先前分配给另一个变量的变量(在我的例子中是数组)的更改不会影响后一个变量的值 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:\&
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变量名V或$V=$null而不是$V.Clear(),或者其他比有人建议的更好的方法
但我的问题是:如何解释clear方法对$V的影响向另一个数组$A的“传播”
已经在PS 5.1版上进行了测试。对于我来说,你所看到的是正常的,我试图解释我自己:
$V="a", "b", "c"
$a = $V
现在$a
包含与$V
相同的引用。如果清除$V
,则清除$a
现在,如果您编写$V=“b”,“c”
,您将通过引用新选项卡来影响$V
。并且此引用与您对$a
的影响不同。因此,如果现在清除$V
,$a
,则不会清除
我清楚了吗?使用Clone()
方法获取数组的真实副本
$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"
有关说明,请阅读:
将数组或哈希表从一个变量复制到另一个变量是可行的,但是
可能会产生意想不到的结果。原因是数组和散列
表不直接存储在变量中,变量总是只存储
单一值。当您使用数组和哈希表时,您
处理对数组或哈希表的引用。所以,如果你
将一个变量的内容复制到另一个变量,只有引用才会被复制
已复制,而不是数组或哈希表。这可能导致
以下意外行为:
$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
顺便说一句,您可以更经常地遇到值类型、引用类型和指针类型这三个术语…那么数组之间的赋值是通过引用一个公共表进行的。谢谢您的详细回答。我发现数组之间的赋值操作是通过引用公共表进行的。在某些情况下,克隆是自动完成的,但并不总是这样。这可以解释我注意到的不同行为。为避免意外结果,更安全的做法是将克隆指定给阵列本身。
# 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