0

Python 関数に渡された変数への変更は、関数のローカル スコープに残り、グローバル スコープには渡されないと思いました。しかし、テストスクリプトを書いたとき:

#! /usr/bin/python
from numpy import *

def fun(box, var):
    box[0]=box[0]*4
    var=var*4
    return 0

ubox,x = array([1.]), 1.
print ubox,x
fun(ubox,x)
print ubox,x

出力は次のとおりです。

[myplay4]$ ./temp.py 
[ 1.] 1.0
[ 4.] 1.0

整数変数 x は関数内の操作の影響を受けませんが、配列は影響を受けます。リストも影響を受けますが、これは個々の要素ではなくリスト/配列スライスを操作する場合にのみ発生します。

この場合、ローカルスコープがグローバルスコープに渡される理由を誰か説明してもらえますか?

4

4 に答える 4

2

あなたの機能で

def fun(box, var):
    box[0]=box[0]*4
    var=var*4
    return 0

boxとは両方ともvarローカルであり、それらを変更しても呼び出しスコープの値は変更されません。ただし、この行:

box[0]=box[0]*4

変化しませんbox。参照するオブジェクトを変更しますbox。その行が次のように書かれている場合

box = box[0]*4 + box[1:]

その後box、スコープを呼び出しても実際には変更されません。

于 2013-01-26T19:45:53.047 に答える
2

重要なことは、オブジェクトを関数に渡す場合、関数はそのオブジェクトの独立したコピーでは機能せず、同じオブジェクトで機能するということです。そのため、オブジェクトへの変更はすべて外部から見えます。

あなたは、ローカル変数への変更はローカルのままであると言います。それは本当ですが、変数の変更 (つまり、変数の再割り当て) にのみ適用されます。変数が指すオブジェクトの変更には適用されません。

あなたの例では、を再割り当てvarするため、変更は外側には見えません。ただしbox、(その要素の 1 つを再割り当てすることによって) 変更しています。その変化は外からも見えます。box別のオブジェクト ( ) を参照するように単純に再割り当てした場合box = something、その変更は外部には表示されません。

于 2013-01-26T19:48:18.297 に答える
1

これはスコープとはまったく関係ありません。

オブジェクトを関数に渡しています。その関数内で、そのオブジェクトが変更されます。ポイントは、関数内の変数が呼び出し元の関数と同じオブジェクトを参照するため、変更が外部から見えることです。

于 2013-01-26T19:43:22.990 に答える
-2

これはスコープに依存しません。Python がオブジェクトをコピーする方法によって異なります。この点で、スカラー、可変オブジェクト、不変オブジェクトの 3 種類のオブジェクトがあります。

スカラーは値によってコピーされ、可変オブジェクトは参照によってコピーされ、不変オブジェクトはおそらく参照によってコピーされますが、それらを変更できないため、意味はありません。

たとえば、スカラーはすべて数値型です。不変は、文字列とタプルです。変更可能: リスト、辞書、その他のオブジェクト。

于 2013-01-26T19:48:20.193 に答える