2013-08-20 97 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 
'' 
>>>