2013-08-20 71 views
1

这里是我的代码:Python模块可变混乱

模块settings.py:

My_KEY = "" 

,我在另一个模块

my_module.py

from settings import My_KEY 


def function_a(): 
    MY_KEY = "abcd" 


def function_b(): 
    function_a(); 
    print My_KEY 
使用此MY_KEY

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

+0

如果你想明确地改变模块级变量更清晰,更明确的直接做到这一点:导入设置然后settings.MY_KEY ='abcd'清楚地表明你想改变这个变量。顺便说一句,对于不改变的常量使用ALL_CAPS是一种惯例,所以这里更加令人困惑 – theodox

回答

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 
3

这是所有关于蟒蛇scoping and namespacing

你确实有3个版本的My_KEY

  • 全局变量My_KEYfunction_a进口
  • My_KEY(我认为你有一个错字有:应My_KEY而不是MY_KEY
  • My_KEYfunction_b

你可以以修改它标志着一个功能global内部变量:

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

作用域是问题的一部分,但你也需要小心你如何导入变量。 from settings import My_KEY在本地模块的命名空间中创建一个指向原始字符串的新变量。当您为模块的My_KEY分配不同的字符串时,不会影响设置模块中的My_KEY。当你修改可变对象时,它不是一个问题,但是每当你重新赋值时,你最好只导入模块本身并使用变量的虚线名称。

settings.py:

My_KEY = "" 

然后快速测试在外壳

>>> 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 
'' 
>>>