PowerShell中创建哈希数组的简写方式为何失效?
PowerShell哈希数组初始化的意外行为
尝试用简写方式初始化指定长度的哈希数组:$array=@(@{"status"=1})*3,但修改数组中某一个元素的哈希值时,数组内所有元素的哈希值都会被更新,不符合预期。
测试代码
$a1=@(@{"status"=1},@{"status"=1},@{"status"=1}) $a2=@(@{"status"=1})*3 $a3=@(1)*3 $a1[1]["status"]=2 $a2[1]["status"]=2 $a3[1]=2 Write-Host "`nArray a1:" $a1 Write-Host "`nArray a2:" $a2 Write-Host "`nArray a3:" $a3
实际运行结果
Array a1: Name Value ---- ----- status 1 status 2 status 1 Array a2: status 2 status 2 status 2 Array a3: 1 2 1
原因分析
PowerShell中,*运算符处理引用类型(比如哈希表[hashtable])时,只是复制对象的引用,而非创建新的独立对象。$a2 = @(@{"status"=1})*3实际上是让数组的三个元素都指向同一个哈希表实例,因此修改任意一个元素的属性,都会影响所有元素。
而像整数这类值类型,*运算符会直接复制值,所以$a3的行为符合预期;$a1则是显式创建了三个独立的哈希表,每个元素都是不同的对象实例,修改单个元素不会影响其他元素。
正确的初始化方式
要创建包含独立哈希表的数组,需要确保每个元素都是新的哈希表实例,可以用循环实现:
# 使用ForEach-Object创建独立哈希表 $a2 = 1..3 | ForEach-Object { @{"status" = 1} }
或者像$a1那样,显式逐个创建哈希表:
$a2 = @(@{"status"=1}, @{"status"=1}, @{"status"=1})
内容的提问来源于stack exchange,提问作者Viktor Stjärne
相关产品推荐
相关产品推荐

