9

我有一个从模块调用的函数。在函数中,我试图访问的两个变量是全局的。当我自己在 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
>>> 

如何在导入模块的代码中使变量成为全局变量或访问函数中的“名称”或“年龄”变量。

4

3 回答 3

4

简单的答案是“不要”。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
于 2013-04-10T11:43:44.537 回答
2

只需将您的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'
于 2013-04-10T11:37:23.893 回答
-1

我很惊讶还没有人提到这个妥协。由于PEP-8不鼓励通配符导入,正如其他人所提到的,您也可以使用它import ... as来使您的代码更加清晰。当其他人编写了一些我需要进行单元测试的(设计不佳的)代码时,我发现自己陷入了这种困境。

如果模块foo.bar包含一个名为VARIABLE的全局变量,那么下面是我在单元测试中如何从它们的模块访问全局变量的示例:

import unittest
import foo.bar as fb

class testFooBar(unittest.TestCase):

    def test_VAR(self):
        self.assertEqual(fb.VARIABLE, 1234, “foo.bar.VARIABLE should be 1234”)
于 2020-07-02T16:13:47.847 回答