You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:52:15