【问题标题】:Powershell array assignment assigns variable, not value?Powershell数组赋值分配变量,而不是值?
【发布时间】:2012-02-05 18:08:12
【问题描述】:

我有一个程序示例,它创建一个数组,然后尝试将该数组的值多次分配给另一个数组作为多维数组。

$a =@(0,0,0)
$b = @($a,$a,$a)
$b[1][2]=2
$b
'And $a is changed too:'
$a

输出是:

PS E:\Workarea> .\what.ps1
0
0
2
0
0
2
0
0
2
And $a is changed too:
0
0
2

所以在这种情况下,变量实际上是指向原始变量。这是非常意外的行为。可以做到这一点相当巧妙,尽管我在 C 编程中从未如此频繁地使用联合。但我想要一种方法来实际只分配值,而不是变量。

$b = @($a.clone(),$a.clone(),$a.clone())

我想会起作用,但有件事告诉我,可能还有比这更优雅的东西。

感谢您的意见。

这是 Windows 7 64 位下的 PowerShell 2.0。

【问题讨论】:

    标签: arrays powershell variable-assignment


    【解决方案1】:

    要将$a 的值分配给$b 而不是对$a 的引用,您可以将变量包装在$() 中。 $() 中的任何内容都会在命令中使用之前进行评估,因此 $($a) 等同于 0, 0, 0

    $a =@(0,0,0)
    $b = @($($a),$($a),$($a))
    $b[1][2]=2
    $b
    '$a is not changed.'
    $a
    

    【讨论】:

    • 谢谢。这样可行。我只是不明白为什么 $a = $b 的一个实例为您提供价值,而另一个实例为您提供参考。尤其是当 $b 可以是任何东西时,不能保证你会得到。
    • 这不是特定于 PowerShell 的;这就是 .NET 处理类(按引用)与结构(按值)的内存分配的方式。数值(int、double 等)也是按值计算的。 albahari.com/valuevsreftypes.aspx 有一个很好的解释。来自微软msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx
    【解决方案2】:

    注意PowerShell中的','不是枚举运算符,而是数组运算符。您呈现为多维数组的东西实际上是一个数组数组,您可以在此处找到多维数组的定义:

    $a= new-object ‘object[,]’ 3,3
    $a[0,2]=3 
    PS > for ($i=0;$i -lt 3;$i++)
    >> {
    >> for($j=0;$j -lt 3;$j++)
    >> {
    >> $a[$i,$j]=$i+$j
    >> }
    >> }
    

    这里所有的工作都是$b 是一个引用数组。

    【讨论】:

    • 我尝试使用真正的多维数组,但当我尝试使用它们时,它们正在翻转鸟儿。显然,我在学习细节方面还有一段路要走。数组数组适用于我正在做的事情,事实上,我正在考虑只使用平面数组。
    • 一组数组适用于我正在做的事情。来自一个前 C 程序员,一维、二维、数组的数组,对我来说都是一样的。这仍然存在将其分配给 $b 的问题。还是可以参考的。使用 $b = $($a),然后 $b[0,2]=3 将数组分配给 [0,2] 失败,因为不支持分配给切片。错误。在我的示例中不会发生这种情况。而且我讨厌输入只是添加评论,而五分钟的编辑窗口很糟糕。只是说。 N00b 在这里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多