我有一个返回全局变量值的函数。当我将此结果分配给局部变量,并更改局部值时,另一个变量也在更改。

例:

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(如果可用)。

09-10 11:40