1

私はこのコードを書きました:

sample_array = ones ([N, 3], dtype = float)
def get_training_set ():
    r = rand (N, 2) * 2 - 1
    sample_array[:,[0,1]] = r
    return sample_array

サンプリング配列を常に割り当てないように、変更するためだけに外部で宣言しました。最後の座標は常に 1 です。

最初は、ステートメント「global sample_array」を関数に挿入する必要があると予想していました。これは、関数を変更するためであり、その結果、評価者はそれがグローバル変数であることを認識している必要があります。

しかし、驚いたことに、「グローバル」なしでうまく機能します。なぜそれが機能するのですか?この場合の評価の定義はどこ/何ですか?

4

2 に答える 2

1

関数内で sample_array が宣言されていないためだと思いますが、書くだけです。Python は、サイド関数の名前空間で sample_array を見つけることができません。外側の名前空間を見つけます。例えば

a = []

def test1():
    a.append(1)  # will use the outer one

def test2():
    a = []
    a.append(1)  # will use the inner one

グローバル、場合によっては、グローバル変数を宣言します。

def declare_global():
  global b  # this should be global after 'declare_global()' is called
  b = 1

print b  # raise NameError: name 'b' is not defined
declare_global()
print b  # will output '1'
于 2013-10-10T08:16:02.517 に答える
1

globalオブジェクトへの参照を変更する場合 (代入など) に必要です。オブジェクトを変更するだけの場合 (たとえば、上記で行ったようなスライス割り当てを使用する場合) は必要 ありません。

正確なドキュメントはhereです。

global ステートメントは、現在のコード ブロック全体を保持する宣言です。これは、リストされた識別子がグローバルとして解釈されることを意味します。

したがって、global ステートメントを使用すると、変数がグローバル コンテキストに存在することを python に伝えます。それに割り当てる場合は、グローバル コンテキストで値を変更します。

global ステートメントを使用しない場合、python は変数がローカルか非ローカルかを決定します。(実際、python3.x はnonlocalキーワードを追加しました)。変数が代入の右側に最初に現れる場合、または項目の代入 ( x[...] = ...) または属性の代入 ( )を行う場合、変数は非ローカルですx.whatever = ...。変数がローカルの場合、それは関数内で作成された (または入力引数である) ことを意味します。ローカル識別子に直接再割り当てでき、問題はありません。変数が非ローカルの場合、変数を変更することはできますが、再割り当てすることはできません。これは、変数がローカルか非ローカルかを Python が判断できないためです。

于 2013-10-10T08:05:59.873 に答える