2013-10-29 113 views
2

我是python的新手,我使用全局變量來輕鬆控制我的設計,特別是對於調試。爲什麼不改變我的全局變量的值生效?

這裏是我的代碼:

hidNow = -1 
def loginFromSql(br, n=0): 
    global hidNow 
    print hidNow 
    hidNow = 5566 
    print hidNow 
print(hidNow) 

我直接運行python 「從MyModule的進口*」

之前仍調用該函數,打印hidNow得到-1的結果,但它 - 1即使函數被調用....

它是Python中的錯誤?我正在使用python 2.7.5

謝謝!

+1

@RobertSadler你在哪裏打開標記!? – admdrew

+6

請修復您的縮進,您的代碼不可讀。 – BrenBarn

+0

你調用了loginFromSql函數嗎?只有在調用函數時纔會進行賦值。 – tdelaney

回答

6

如果您的電子郵件地址爲from myModule import *,則在導入的位置創建名爲hidNow的變量。該新變量與myModule內部的hidNow分開。它們最初具有相同的值,但從myModule中爲hidNow分配新值不會更改您已導入的值。

一個解決方案是不要使用*導入。相反,這樣做:

import myModule 
print myModule.hidNow 
myModule.loginFromSql() 
print myModule.hidNow # will change 

(這是我認爲你問,但你的問題和代碼都不清楚,所以請編輯並糾正它,如果這是你在說不是什麼。)

你應該考慮爲什麼你要使用全局變量來存儲這些信息。全局變量很脆弱。

+0

如何提及使用類來維護狀態而不是全局變量 – wim

+1

@wim:嬰兒的步驟,嬰兒的步驟。 。 。 :-) – BrenBarn

+0

好的,我會再添加一個答案 – wim

0

你定義了loginFromSql,但你沒有調用它。以下是您的示例腳本,其中包含一些額外的打印和對函數的調用。

hidNow = -1 
def loginFromSql(br, n=0): 
    global hidNow 
    print "login start", hidNow 
    hidNow = 5566 
    print "login done", hidNow 

print "before call", hidNow 
loginFromSql('x') 
print "after call", hidNow 

當你運行它,你會得到這樣的輸出,顯示,全球確實改變

before call -1 
login start -1 
login done 5566 
after call 5566 
+0

如果這些代碼被添加到文件中,那麼這是真的,但如果這些代碼是直接在python交互模式下輸入的話,則不是這樣的 –

+0

@ Yu-Chih,沒有他們在交互模式下工作。嘗試複製/粘貼到解釋器中。 – tdelaney

2

我使用一個全局變量來控制我的設計容易,調試尤其是 。

clippy

我要去掩飾實際問題(作爲另一個答案已經指出的原因),並解決這個XY problem的X部分。

這並不能真正控制你的設計,就像你可能認爲的那樣,在模塊級別使用全局變量通常是沒有必要的,並且會出現在很多python開發人員身上,如code smell

一個更好的辦法來保持狀態是使用一類,它會去是這樣的:

# myModule.py 
class Thing(object): 

    def __init__(self, hidNow=-1): 
    self.hidNow = hidNow 

    def loginFromSql(self, br, n=0): 
    self.hidNow = 5566 

在這裏你看到的訪問方法此屬性,並看到價值變動發生。

>>> from myModule import * 
>>> my_thing = Thing() 
>>> my_thing.hidNow 
-1 
>>> my_thing.loginFromSql('potato') 
>>> my_thing.hidNow 
5566 
相關問題