我有一个返回全局变量值的函数。当我将此结果分配给局部变量,并更改局部值时,另一个变量也在更改。
例:
function setGlobal
{
$temp = @{}
$temp.id = 50;
$Global:global1 = $temp;
return $Global:global1;
}
然后我调用此函数,并设置结果值:
$result = setGlobal
$result.id = 80
现在两个变量具有相同的值。
$Global:global1 # id = 60
$result # id = 60
如何防止这种情况发生?为什么更改本地值会影响全局副本?
最佳答案
原因当然是您没有该对象的两个副本。您有两个对同一个对象(哈希表)的引用。引用被复制,而不是对象。物体就像房子。变量(global1和result)就像张纸一样。我将房子的地址写在我的纸上(global1),然后将地址复制到您的纸上(结果)。然后,转到您拥有的地址并将门漆成红色。现在,当我到达地址时,我的房子现在有一扇红门。
深度复制对象比复制房屋要容易一些。对于任意对象,请使用PSObject.Copy()
:
function setGlobal
{
$temp = @{}
$temp.id = 50;
$Global:global1 = $temp;
return $Global:global1.PSObject.Copy();
}
在这种情况下,这与Clone完全相同,因为PSObject.Copy使用Clone(如果可用)。