如何在__main__范围内访问全局变量?

时间:2014-06-06 05:57:22

标签: python namespaces

我对python

中变量的名称空间和范围感到困惑

假设我有一个test.py:

# -*- coding: utf-8 -*-
"""
@author: jason
"""

if __name__ == '__main__':
    global strName
    print strName

然后,我定义一个名为strName的变量并尝试在test.py中访问它,但它会抛出一个错误:

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 :(得分:1)

<强> test.py:

strName = "John Doe"
print strName

Interactive Shell:

$ python
>>> from test import strName
>>> print strName
John Doe

答案 1 :(得分:1)

global不是全球性的。 global是模块级别的;真正的全局变量如minint存在于__builtin__模块(Python 3中的builtins)中。在模块级别使用global声明是多余的。

我强烈建议您以另一种方式将数据传递给test.py,例如在其中定义一个函数并将字符串作为参数传递:

test.py:

def print_thing(thing):
    print thing

其他想要使用test.py的代码:

import test
test.print_thing("Joe")

答案 2 :(得分:0)

Global专门用于在方法外定义变量并希望在该方法中使用它而不传入参数的情况。它放在方法的顶部,以便python将该变量视为全局变量,而不是具有相同名称的新局部变量。 Global不是声明变量的方法,并且由于strName不存在,因此全局无法确定strName的位置。