2013-11-15 57 views
-2

我是新來的Python,我不明白這是如何工作的。我想爲Python中的一個對象賦值,如果它目前未定義的話,但是當我運行if語句時,它會失敗,因爲對象沒有定義(Duh。)。Python - 檢查空對象

我該如何解決這個問題?

... 
key = raw_input('What is your key?: ') 

for i in key: 
    print i 
    if Count is None: 
     Count = 0 

Traceback (most recent call last): 
    File "Client.py", line 7, in <module> 
    if Count is None: 
NameError: name 'Count' is not defined 

我能做些什麼來解決這個看似簡單的問題?

上面的代碼是垃圾,是我測試的基本Python功能的理解。它讓我回到了爲一個對象分配值的問題,這是我之前遇到的一個問題。以下是我的思考過程。

好吧,很顯然我在這裏沒有足夠的解釋。我不確定它是什麼,但是有些東西讓我不得不爲一個不相關的對象賦值。 爲了便於閱讀,我希望在語句中使用它之前檢查對象的空值。從我在下面看到的內容來看,這將是必要的,而且我很可能不得不面對。在我看來,這...

... 
object = 'ObligatoryValue' 

for i in Data 
    Object = Data[0] # Now the object is relevant 
    ... 

看起來比這更好的...

... 
for i in Data 
    if Object is None: 
     Object = Data[0] 
    ... 

爲了進一步解釋的理由,我在數據處理工作。我第一次遇到這個問題是當我比較兩個對象時。如果試圖做類似...

... 
Object = Line[0] 
if UndefinedObject == Object 
    do = 'something' 
... 

但我總是有一個錯誤返回,因爲UndefinedObject沒有分配一個值。

+1

計數是什麼? –

+1

你不能。作業*是*定義名稱。你可以檢查是否已經分配了一個全局,但你通常不會。你的用例是什麼? –

+0

您可以先將'None'分配給'Count';在頂部添加'Count = None',但是確實有點小問題。 –

回答

5

您可以設置CountNone明確的,第一:

Count = None 

for i in key: 
    if Count is None: 
     Count = 0 

但在這種情況下,它會更容易只分配0開始說起:

Count = 0 

for i in key: 
-2

你可以將它定義爲空串之前你可以檢查:

Count = '' 

然後你可以測試...

if not Count: 
    Count = 0; 
+2

爲什麼要將它定義爲空字符串,而不是Python中慣用的「空值」,例如'None',正如Martijn Pieters的回答所示? – abarnert

+0

儘管最終結果是相同的......「if not Count:」位在邏輯上與原始問題試圖執行的內容一致(如果count還沒有被賦值,那麼賦值爲「」)。 至少這將是我的意見... – MrBooks

+0

它比原來的東西更符合邏輯上的原則嗎?此外,這種檢查甚至不起作用,因爲'不計數'對於' 0',因爲它是''''。 – abarnert

2

這幾乎肯定是一個非常糟糕的主意。正如大家在評論中所解釋的那樣,Martijn Pieters的回答顯示,有更好的方式去做幾乎任何你想做的事情。

此外,這是而不是「檢查空對象」。 「空對象」是None。 Martijn的答案顯示瞭如何做到這一點。這是檢查變量沒有被綁定,而不是被綁定到空對象的變量。不管怎樣,Python並不妨礙你這樣做,它只是不容易(因爲它的幾乎是總是一個壞主意,但偶爾也是必要的)。

所以,這裏是如何做到這一點:

for i in key: 
    try: 
     Count 
    except NameError: 
     Count = 0 

或者,如果你需要知道它是否存在於一個特定的範圍 - 例如,你只要有一個全球Count,不是Count關心任何地方:

for i in key: 
    if 'Count' not in globals(): 
     Count = 0 

或者你也可以在適當的命名空間使用hasattrgetattr

+0

我喜歡你在那裏的第二個陳述。這對我來說似乎更加乾淨。請原諒我對Python的基本用法的無知。我只用了幾天。這次真是萬分感謝。 – vbiqvitovs

+0

@vbiqvitovs:我明確地避免告訴你如何做到這一點(我只說過它是可能的)。它通常表明你正在嘗試做你真正不應該做的事情,或者至少根本不需要做。你可以逆流游泳,但爲什麼這麼努力呢? –

+0

@vbiqvitovs:如果你只用了幾天Python,我甚至更確定你不想這樣做。我在猜測你是新手程序員,還是來自Javascript,對'undefined'的測試是慣用的和常見的,對嗎?解釋你實際上想要做什麼,並且我們可以告訴你如何在Python中做得很好,而不是告訴你如何將Python用作糟糕的JavaScript版本。 – abarnert