2009-04-28 47 views
3

基本上我有一些變數,我不想預初始化:如何將變量初始化爲None/Undefined並與Python中的其他變量進行比較?

originalTime = None 
recentTime = None 
postTime = None 

def DoSomething () : 
    if originalTime == None or (postTime - recentTime).seconds > 5 : 
     ... 

我得到的編譯錯誤,如果:

UnboundLocalError: local variable 'originalTime' referenced before assignment 

正如你可以看到,所有的變量有不同的關係:要麼設置正確(時間,時間+5等)或沒有,但我不想將它們設置爲預先計算的值時,只需將它們聲明爲無更容易。

任何想法?

+2

您需要張貼更多代碼。這段代碼很好。沒有足夠的信息來重現甚至理解問題。 – 2009-04-29 00:07:29

+0

-1;即使在編輯之後,這個問題仍然是不可理解的。 DoSomething函數沒有顯示任何賦值給任何變量(沒有這個變量,沒有`UnboundLocalError`會發生),並且不清楚你的實際問題是什麼。 – 2016-03-27 00:24:41

回答

12

我需要糾正賈勒特哈迪,因爲我沒有足夠的代表評論。

全球範圍不是問題。 Python會自動在封閉範圍中查找變量名稱。唯一的問題是當你想改變價值。如果您只是重新定義變量,Python將創建一個新的局部變量,除非使用全局關鍵字。所以

originalTime = None 

def doSomething(): 
    if originalTime: 
    print "originalTime is not None and does not evaluate to False" 
    else: 
    print "originalTime is None or evaluates to False" 

def doSomethingElse(): 
    originalTime = True 

def doSomethingCompletelyDifferent() 
    global originalTime 
    originalTime = True 

doSomething() 
doSomethingElse() 
doSomething() 
doSomethingCompletelyDifferent() 
doSomething() 

應該輸出:

originalTime is None or evaluates to False 
originalTime is None or evaluates to False 
originalTime is not None and does not evaluate to False 

我第二次他的警告,這是糟糕的設計。

-2

我剛剛在shell中嘗試了您的代碼,但沒有收到錯誤消息。它應該工作。也許發佈整個代碼? 你也可以使用try/catch。或者當地人()。has_key('originalTime')?

6

你的代碼應該已經工作了,我猜它是在一個函數內,但originalTime是在別的地方定義的。 如果這就是你真正想要的或更好的not originalTime,那麼說originalTime is None更好。

+0

感謝您的提示。 – 2009-04-28 23:39:17

+2

只需在Scott的適當建議中添加None即可:請注意,「not originalTime」將匹配originalTime爲0或「」或False的情況,而originalTime爲None將僅匹配originalTime實際上爲「無」的情況。許多開發人員使用這種差異來描述那些在執行上下文中沒有價值的變量。 (即:def myfunc(somevar = None):如果somevar是None:somevar = 5#否則假設somevar = 0是故意的) – 2009-04-29 00:08:56

0

如果if語句位於函數中,但= None聲明處於模塊級別,則該函數中的變量超出了範圍。最簡單的解決方法是明確指出變量標識符是在全球範圍內被發現:

def doSomething(): 
    global originalTime 
    if originalTime: 
     print "originalTime exists and does not evaluate to False" 

現在有不少人認爲這是窮人Python的設計,順便說一句。如果您同意這種評估,並且您的架構允許,您可能希望重構您的函數,以便它接收外部依賴項作爲函數參數。

+0

謝謝,因爲我認爲不好的設計。如果它是純粹的Python,我不會這樣做,但我正在使用一個三維派對應用程序的Python集成,這是非常糟糕的和錯誤的,但這就是我必須使用的。 – 2009-04-29 16:08:34

-2

這裏沒有任何「漂亮」的方法。正是基於那你給變量名,我的第一直覺就是創建一個對象:

class SomeTimeClass(object): 
    def __init__(self, recentTime=None, originalTime=None, postTime=None): 
     self.recentTime = recentTime 
     self.originalTime = originalTime 
     self.postTime = postTime 

time = SomeTimeClass() 
if not time.recentTime:: 
    ... 

這可能工作,因爲它聽起來像變量相關。一對夫婦的其他選項:

包裹過程中的功能:

def SomeFunc(recentTime=None, originalTime=None, postTime=None): 
    if not recentTime: 
     ... 

使用的字典:

some_dict = {} 

if not some_dict.get('originalTime', None): #return None if key doesn't exist 
    ... 
0

==>如果初始值是None

>>>toto = None 

>>>toto = toto if toto is not None else "default Value" 

>>>toto 

'default value' 

==>的情況下的變量只是不存在

>>>del toto 

>>>toto = toto if locals().get('toto') else "default Value" 

>>> toto 

'default value' 

==>在的情況下的值被設定相同的命令

>>>toto = 1 

>>>toto 

1 

>>>toto = toto if locals().get('toto') else "default Value" 

1 
相關問題