PowerShell使用寫入時複製語義的內部作用域。PowerShell複製寫入行爲取決於操作員類型
這意味着如果您要更改內部範圍中的外部變量,那麼內部範圍將處理它自己的副本。這裏有一個例子:
$list = @(1, 2)
Function Foo
{
"Foo: initial value - $list"
$list = $list + 3
"Foo: `$list: $list, `$global:list: $global:list"
}
輸出將是:
Foo: initial value - 1 2
Foo: $list: 1 2 3, $global:list: 1 2
好吧,這種行爲是由設計。但是讓我們改變Foo
功能位:
Function Foo { "Foo: initial value - $list" $list += 3 "Foo: `$list: $list, `$global:list: $global:list" }
輸出將是:
Foo: initial value - 1 2 Foo: $list: 3, $global:list: 1 2
嗯...我可以假設x += y
運營商是不完全一樣的是x = x + y
。但這並不是要求。讓我們改變代碼一次:
Function Foo { New-Variable -Name z -Value 42 "Foo: initial value - $list" $list += 3 "Foo: `$list: $list, `$global:list: $global:list" }
而且現在的輸出將是:
Foo: initial value - 1 2
Foo: $list: 1 2 3, $global:list: 1 2
這似乎是一個錯誤。唯一的問題是究竟在哪裏?我認爲在第二種情況下+=
的行爲不正確。但也許我錯過了一些東西......
我沒有證據表明這一點,但我認爲這裏的問題是什麼'+ ='解析成局部變量是什麼時候重新創建與何時被複制。在內部作用域中使用'$ list'會觸發'+ ='本身不包含的副本。這與作用域中變量的python行爲類似,以及作用域中稍後的賦值如何隱式地映射此範圍內較早使用的全局(由於提升)。 –
但是爲什麼'+ ='與'New-Variable' cmdlet一起使用在方法的開頭?這種行爲上的差異就是一個bug。問題是:什麼是「正確的」行爲? –
它可能會強制內部作用域的初始化,而'+ ='賦值並不是,但肯定是奇怪且令人困惑。在原來的閱讀中我錯過了這個區別。 –