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

在 functionTest2中,当你声明global xx是一个全局变量时,Python 将在全局命名空间中搜索它。由于在全局命名空间中没有x定义变量,NameError因此引发了。

如果您阅读官方文档,您可以看到该eval函数不受该global语句的影响,因此在Test2创建exec一个名为x2 的新局部变量,但不是全局变量;theprintglobal语句影响并x在全局命名空间中搜索它不存在的地方。在 Test3 中,该x=2语句受该语句的影响,global因此创建了一个名为 x 的全局变量,其值为 2。

于 2012-07-25T21:38:59.707 回答
2

@SanSS 给出的答案是正确的,@Colin Dunklau 的评论也是正确的,但我想添加更多信息。可能会绊倒您的一件事是global xTest2 中的 in没有传递到执行代码。所以 exec 创建一个局部变量x,而print x尝试读取一个全局变量。这两个例子可能会有所帮助。. .

在这里,通过传递一个 dict,您告诉 exec 将其用作全局变量局部变量,因此 exec 分配给全局变量:

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

在这里,通过在 exec 代码中包含全局声明,您可以将 exec 分配给全局,然后 print 语句读取:

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

然而,重申一下,使用exec. 有时只是为了了解 Python 的工作原理而玩弄这样的东西会很好,但在少数情况下,这是用代码实际完成某些事情的好方法。

于 2012-07-25T21:51:38.933 回答