从导入模块中的函数访问全局变量

bad*_*ngs 7 python module function global-variables python-2.7

我有一个函数,我从模块调用.在函数内,我试图访问的两个变量是全局的.当我在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? "))
Run Code Online (Sandbox Code Playgroud)

我自己运行时的输出.

>>> globaltest()
What is your name? tom
What is your age? 16
>>> name
'tom'
>>> age
16
Run Code Online (Sandbox Code Playgroud)

和导入它的代码.

import name_age

name_age.globaltest()
Run Code Online (Sandbox Code Playgroud)

但是当我运行尝试访问我导入它的代码中的变量时.

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
>>> 
Run Code Online (Sandbox Code Playgroud)

如何在导入模块的代码中创建变量global,或者访问函数中的'name'或'age'变量.

bru*_*ers 5

简单的答案是“不要”。Python的“全局变量”只是模块级全局变量,甚至应尽可能避免使用模块级全局变量(即可变的模块级全局变量),实际上使用它的理由很少。

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

#module.py

def noglobaltest():
    name = str(raw_input("What is your name? "))
    age = int(raw_input("What is your age? "))
    return name, age 
Run Code Online (Sandbox Code Playgroud)

然后:

from module import noglobaltest

name, age = noglobaltest()
print "name :", name, "age :", age
Run Code Online (Sandbox Code Playgroud)


Tha*_*sas 2

只需将您的import声明更改为以下内容即可:

from name_age import *
Run Code Online (Sandbox Code Playgroud)

例子:

In [1]: from name_age import *
In [2]: print name
Out[2]: 'tom'
Run Code Online (Sandbox Code Playgroud)

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

例子:

In [1]: import name_age
In [2]: print name_age.name
Out[2]: 'tom'
Run Code Online (Sandbox Code Playgroud)

  • 明星导入与全局导入一样邪恶。@badathings:_不要_这样做。 (3认同)
  • 来自 [PEP8](http://legacy.python.org/dev/peps/pep-0008/#imports) *“应避免使用通配符导入(from &lt;module&gt; import *),因为它们使得不清楚哪些名称是存在于命名空间中,使读者和许多自动化工具感到困惑......”* (3认同)