如何在__main__作用域中访问全局变量?
我对Python中的命名空间和变量的作用域有点困惑。
假设我有一个叫做test.py的文件:
# -*- coding: utf-8 -*-
"""
@author: jason
"""
if __name__ == '__main__':
global strName
print strName
然后,我在这个文件里定义了一个叫做strName的变量,但当我尝试访问它时,却出现了错误:
In [9]: strName = "Joe"
In [10]: run test.py hello
--------------------------------------------------------------------------- NameError Traceback (most recent call last) C:\Anaconda\lib\site-packages\IPython\utils\py3compat.pyc in execfile(fname, glob, loc)
195 else:
196 filename = fname
--> 197 exec compile(scripttext, filename, 'exec') in glob, loc
198 else:
199 def execfile(fname, *where):
d:\playground\test.py in <module>()
13 print "hello"
14 global strName
---> 15 print strName
16
NameError: global name 'strName' is not defined
In [11]:
我想知道为什么会这样,是否有什么方法可以在test.py中访问strName?
3 个回答
0
全局变量是用来处理这种情况的:你在一个方法外面定义了一个变量,然后想在这个方法里面使用它,而不想通过参数传递。你需要把它放在方法的最上面,这样Python才会把这个变量当作全局变量来处理,而不是当作一个新的局部变量(即在这个方法里重新定义的变量),即使它们的名字是一样的。全局变量并不是用来声明变量的方式,而且因为strName这个变量并不存在,所以全局变量也无法找到strName的位置。
1
test.py:
strName = "John Doe"
print strName
交互式命令行:
$ python
>>> from test import strName
>>> print strName
John Doe
4
global
这个词其实并不是我们想象中的“全球”的意思。它的作用是针对模块的,也就是说它只在当前的模块中有效。真正的全局变量,比如 min
和 int
,是存在于一个叫 __builtin__
的模块里(在 Python 3 中叫 builtins
)。所以在模块的层面上使用 global
其实是多余的。
我强烈建议你用其他方式把数据传递给 test.py
,比如在 test.py
中定义一个函数,然后把你的字符串作为参数传进去:
test.py:
def print_thing(thing):
print thing
想要使用 test.py
的其他代码:
import test
test.print_thing("Joe")