2013-04-10 124 views
6

我有一个函数,我从模块调用。在函数中,我试图访问的两个变量是全局的。当我单独运行IDLE模块时,我仍然可以在函数结束后访问变量,如预期的那样。当我将模块导入到代码中的函数中时,我无法访问这些变量。访问导入模块中函数的全局变量

#module to be imported 

def globaltest(): 
    global name 
    global age 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 

当我自己运行它时的输出。

>>> globaltest() 
What is your name? tom 
What is your age? 16 
>>> name 
'tom' 
>>> age 
16 

并在其中导入它的代码。

import name_age 

name_age.globaltest() 

但是当我运行试图访问我导入它的代码中的变量。

What is your name? tom 
What is your age? 16 
>>> name 

Traceback (most recent call last): 
File "<pyshell#10>", line 1, in <module> 
name 
NameError: name 'name' is not defined 
>>> 

我怎样才能让在我已导入模块或访问“名称”,或在功能“年龄”变量代码变量全球。

回答

1

只要改变你的import声明这一个:

from name_age import * 

例如:

In [1]: from name_age import * 
In [2]: print name 
Out[2]: 'tom' 

否则,如果你想使用import name_age语句,那么你必须访问global变量通过模块名称参考,即:

例如:

In [1]: import name_age 
In [2]: print name_age.name 
Out[2]: 'tom' 
+2

星级进口大约为邪恶的全局。 @badathings:_dont_这样做。 – 2013-04-10 11:45:43

+0

@bruno desthuilliers:好的,谢谢。 – 2013-04-10 11:46:46

+1

从[PEP8](http://legacy.python.org/dev/peps/pep-0008/#imports)*“应避免使用通配符导入(从导入*),因为它们不清楚哪些名称存在在命名空间中,混淆了读者和许多自动化工具......“* – SiHa 2014-06-20 07:14:29

3

简单的答案是 “不”。 Python的“全局变量”只是模块级的全局变量,甚至应该尽可能地避免模块级的全局变量(可变模块级全局变量),而使用它的真正原因非常之少。

正确的解决方案是学会正确使用函数参数和返回值。在你的情况下,第一种方法是

#module.py 

def noglobaltest(): 
    name = str(raw_input("What is your name? ")) 
    age = int(raw_input("What is your age? ")) 
    return name, age 

然后:

from module import noglobaltest 

name, age = noglobaltest() 
print "name :", name, "age :", age