0

以下のコードは問題を完全に説明していると思います。Test2 関数で x が定義されていないのはなぜですか? Test3 関数がエラーを返さないのはなぜですか?

>>> def Test1():
exec('x=2')
print(str(x))


>>> Test1()
2
>>> def Test2():
global x
exec('x=2')
print(str(x))


>>> Test2()

Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
Test2()
File "<pyshell#38>", line 4, in Test2
print(str(x))
NameError: global name 'x' is not defined

>>> def Test3():
global x
x=2
print(str(x))

>>> Test3()
2
4

2 に答える 2

2

@Colin Dunklauのコメントと同様に、@SanSSの回答は正しいですが、もう少し情報を追加したかったのです。つまずく可能性があることの 1 つはglobal x、Test2の が実行されたコードに引き継がれないことです。したがって、exec はローカル変数を作成しx、一方、print xグローバル変数を読み取ろうとします。これらの 2 つの例が役立つ場合があります。. .

ここで dict を 1 つ渡すことで、それをグローバルおよびローカルとして使用するように exec に指示するため、exec はグローバルに割り当てます。

>>> def Test2():
...     global x
...     exec 'x=2' in globals()
...     print(str(x))
>>> Test2()
2

ここで、exec-ed コードにグローバル宣言を含めることで、exec がグローバルに割り当てられ、print ステートメントが次のように読み取ります。

>>> def Test2():
...     global x
...     exec('global x; x=2')
...     print(str(x))
>>> Test2()
2

ただし、繰り返しますが、通常、 を使用することはお勧めできませんexec。Python がどのように機能するかを理解するためだけに、このようなものをいじってみるのも良いことですが、実際にコードで何かを達成するのにこれが良い方法であるケースはほとんどありません。

于 2012-07-25T21:51:38.933 に答える
2

functionTest2では、それがグローバル変数であることを宣言しglobal xているxため、Python はグローバル名前空間でそれを検索します。xグローバル名前空間に変数が定義されていないため、NameErrorが発生します。

公式ドキュメントを読むと、関数がステートメントevalの影響を受けないことがわかります。そのため、値 2 で名前が付けられた新しいローカル変数を作成していますが、グローバルではありません。はステートメントの影響を受け、存在しないグローバル名前空間でを検索します。Test3 では、ステートメントはステートメントの影響を受け、値 2 を持つ x という名前のグローバル変数を作成します。globalTest2execxprintglobalxx=2global

于 2012-07-25T21:38:59.707 に答える