AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 573944
Accepted
Rob Nicholson
Rob Nicholson
Asked: 2014-02-08 05:06:25 +0800 CST2014-02-08 05:06:25 +0800 CST 2014-02-08 05:06:25 +0800 CST

确认阵列上的 PowerShell 行为

  • 772

考虑以下小脚本:

$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

我的澄清意见:

  1. $b 数组在输出中包含四个元素,因此 $b = $a 正在创建一个包含三个项目的原始数组的副本,然后添加 99 元素。如果 $b = $a 是一个指针操作,那么向 $b 添加一个元素也会影响 $a 数组
  2. 该数组包含指向整数的指针,而不是整数本身。事实证明,第 3 行更改了两个数组的内容。如果 $a 包含整数,则 $b 不会受到影响

所以我的理解是:

PowerShell 数组始终是指针数组,即使它只包含整数。将数组分配给另一个变量会创建该指针数组的副本。

正确的?

powershell
  • 2 2 个回答
  • 937 Views

2 个回答

  • Voted
  1. Best Answer
    Vasili Syrakis
    2014-02-09T17:48:47+08:002014-02-09T17:48:47+08:00

    我不知道这背后的真正原因,但如果你看看这个行为,你就可以开始理解它了:

    $a = @(1,2,3)
    [int[]]$b = $a
    $a[0] = 101
    $b += 99
    
    Write-Host $a"`n"
    101 2 3
    
    Write-Host $b"`n"
    1 2 3 99
    

    您可以看到它没有“链接”$b到$a,而是将其初始化为一个单独的数组。


    进一步阅读值类型 VS 引用类型

    http://www.leeholmes.com/blog/2006/09/05/value-types-vs-reference-types/

    http://kizan.com/20143263-reference-types-powershell/

    • 3
  2. MDMoore313
    2014-02-08T06:07:15+08:002014-02-08T06:07:15+08:00

    我认为在内部这些是作为链表而不是数组实现的。不同之处在于向数组添加项非常昂贵,因为声明了数组的大小,然后为其分配连续的内存。因此,不能保证数组可以使用下一个连续的内存块,并且必须创建一个大小为 (origArray + 1) 的新数组,复制旧数组并复制新元素. 除了编程经验和观察powershell的行为之外,我当然没有证据证明这一点。

    更新

    我有证据!避免列表运算符与如何在 powershell中声明数组。New-Object声明数组时请注意 cmdlet 的用户:

    PS > $myArray = New-Object string[] 10
    

    因此,您在命令行上与之交互的是两个链表。我不确定 Powershell/.NET 如何处理复制链表,尽管从您的示例中可以看出,为了提高效率,它只包含$b与再次明确复制。我喜欢将此称为 a ,尽管我不知道该术语是否在该领域中使用。$a$b$astatic copy

    • 1

相关问题

  • 资源锁和电源外壳

  • 脚本 - 如何断开远程桌面会话?

  • 如何限制向通讯组发送到外部地址?

  • Powershell对值与数组的作用不同?

  • Windows Powershell Vim 键绑定

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve