1

这是我的代码:

一个模块settings.py:

My_KEY = ""

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

我的模块.py

from settings import My_KEY


def function_a():
    MY_KEY = "abcd"


def function_b():
    function_a();
    print My_KEY

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

4

3 回答 3

6

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

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

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
于 2013-08-20T22:02:13.097 回答
3

这都是关于 python作用域和命名空间的。

您实际上有 3 个版本My_KEY

  • My_KEY导入的全局变量
  • My_KEYfunction_a(我认为你有一个错字:应该My_KEY代替MY_KEY
  • My_KEYfunction_b

您可以在函数内标记变量global,以便对其进行修改:

def function_a():
    global My_KEY
    My_KEY = "abcd"
于 2013-08-20T22:02:51.733 回答
0

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

设置.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
''
>>> 
于 2013-08-20T22:41:54.853 回答