考虑以下小脚本:
$a = @(1,2,3) #1 $b = $a #2 $a[0] = 101 #3 $b += 99 #4 写主机“a:$a” 写主机 "b: $b"
输出是这个,需要我思考一下:
甲:101 2 3 乙:101 2 3 99
我的澄清意见:
- $b 数组在输出中包含四个元素,因此 $b = $a 正在创建一个包含三个项目的原始数组的副本,然后添加 99 元素。如果 $b = $a 是一个指针操作,那么向 $b 添加一个元素也会影响 $a 数组
- 该数组包含指向整数的指针,而不是整数本身。事实证明,第 3 行更改了两个数组的内容。如果 $a 包含整数,则 $b 不会受到影响
所以我的理解是:
PowerShell 数组始终是指针数组,即使它只包含整数。将数组分配给另一个变量会创建该指针数组的副本。
正确的?
我不知道这背后的真正原因,但如果你看看这个行为,你就可以开始理解它了:
您可以看到它没有“链接”
$b
到$a
,而是将其初始化为一个单独的数组。进一步阅读值类型 VS 引用类型
我认为在内部这些是作为链表而不是数组实现的。不同之处在于向数组添加项非常昂贵,因为声明了数组的大小,然后为其分配连续的内存。因此,不能保证数组可以使用下一个连续的内存块,并且必须创建一个大小为 (origArray + 1) 的新数组,复制旧数组并复制新元素. 除了编程经验和观察powershell的行为之外,我当然没有证据证明这一点。
更新
我有证据!避免列表运算符与如何在 powershell中声明数组。
New-Object
声明数组时请注意 cmdlet 的用户:因此,您在命令行上与之交互的是两个链表。我不确定 Powershell/.NET 如何处理复制链表,尽管从您的示例中可以看出,为了提高效率,它只包含
$b
与再次明确复制。我喜欢将此称为 a ,尽管我不知道该术语是否在该领域中使用。$a
$b
$a
static copy