这是我的代码:
模块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”,但是为什么我得到空字符串。我完全失去了
答案 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
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
''
>>>