Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays powershell数组清除方法和分配_Arrays_Powershell_Variable Assignment - Fatal编程技术网

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