python模块变量混乱

时间:2013-08-20 22:00:46

标签: python

这是我的代码:

模块settings.py:

My_KEY = ""

我正在另一个模块中使用这个MY_KEY

my_module.py

from settings import My_KEY


def function_a():
    MY_KEY = "abcd"


def function_b():
    function_a();
    print My_KEY

当我调用function_b()时,我希望在输出中看到“abcd”,但是为什么我得到空字符串。我完全失去了

3 个答案:

答案 0 :(得分:6)

默认情况下,当在函数内部遇到赋值语句时,Python会将左侧的变量作为局部变量。

如果要从函数内修改全局变量,请使用global statement将变量声明为全局变量:

def function_a():
    global My_KEY
    My_KEY = "abcd"

但是,最好避免在函数内修改全局变量。从长远来看,它使代码更难理解。您可以将My_KEY作为function_a的返回值传递:

def function_a():
    My_KEY = "abcd"
    return My_KEY

def function_b():
    My_KEY = function_a()
    print My_KEY

答案 1 :(得分:3)

所有关于python scoping and namespacing

您实际上有My_KEY的3个版本:

  • 导入全局变量My_KEY
  • {li} My_KEY function_a(我认为你有一个拼写错误:My_KEY而不是MY_KEY) 在My_KEY
  • function_b

您可以将函数内的变量标记为global以进行修改:

def function_a():
    global My_KEY
    My_KEY = "abcd"

答案 2 :(得分:0)

范围界定是问题的一部分,但您还需要注意如何导入变量。 from settings import My_KEY在本地模块的命名空间中创建一个指向原始字符串的新变量。为模块的My_KEY分配不同的字符串时,这不会影响设置模块中的My_KEY。在修改可变对象时不是问题,但是每次重新分配值时,最好只是导入模块本身并使用变量的点名称。

settings.py:

My_KEY = ""

然后在shell中进行快速测试

>>> from settings import My_KEY
>>> def function_a():
...     global My_KEY
...     My_KEY="abcd"
... 
>>> My_KEY
''
>>> function_a()
>>> My_KEY
'abcd'
>>> 
>>> # here's where it gets funky... the original settings.My_KEY didn't change 
>>> 
>>> import settings
>>> settings.My_KEY
''
>>>