如何在__main__作用域中访问全局变量?

3 投票
3 回答
4848 浏览
提问于 2025-04-18 08:49

我对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 这个词其实并不是我们想象中的“全球”的意思。它的作用是针对模块的,也就是说它只在当前的模块中有效。真正的全局变量,比如 minint,是存在于一个叫 __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")

撰写回答