2013-03-27 28 views
8
Variable = None 

這三個在特定場景中是否有區別?如果哪一個更適合使用沒有區別?'變量'或'變量不是無'

if Variable: 
print "Hello world" 

if Variable is not None: 
print "Hello world" 

if Variable != None: 
print "Hello world" 

在無變的情況下相同的?如果xNoneFalse[]{}

x is not None永遠是True,除非變量實際上是None

+0

也許他混了'如果x None'和'如果x == None' – jamylak 2013-03-27 05:29:06

+0

是啊,對。感謝提醒 – 2013-03-27 05:29:32

+0

這應該是封閉的,它不是一個真正的問題或重複。 http:// stackoverflow。com/questions/3257919/is-none-vs-none http://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none – jamylak 2013-03-27 05:34:18

回答

8

在特定情況下,這三者之間是否有區別?

第一個問是否該變量是任何虛假。除了None - False0,任何空序列等,這個測試將會失敗。

第二個問是否是魔術單身常量None。這隻會失敗None本身。

第三個問是否它認爲自己等於None。這將失敗,例如,Holder(None),其中Holder是一個包裝類,其實例比較等於他們所持有的任何東西。或者,給出不太現實但較短的代碼例如:

class Stupid(object): 
    def __ne__(self, other): 
     return False 
Variable = Stupid() 

最後一個很少用;事實上,如果你認爲你可能需要檢查== None!= None,並且你還沒有專門創建透明包裝類或類似的東西,那麼你可能真的想要is Noneis not None。但其他兩個都非常有用和普遍。

如果沒有差別哪一個更適合使用?

那麼,有的區別,哪一個更適合取決於具體的用途。

在問題的最後,您似乎可能會問在Variable肯定是None的具體情況中是否有任何區別。在這種情況下,三者之間當然沒有功能上的區別。*所有這些都保證是錯誤的,因此什麼也不做。這意味着三者之間也沒有區別,也沒有寫任何代碼。這是更簡單,更可讀,更快。

*有一個性能差異 - 第一個不需要LOAD_CONSTNone,或者調用比較運算符。而且,即使你設法重新綁定None或改變None常數的值(也許是通過跺腳堆滿​​?),第一個更有可能仍然有效。但是,這些都不會有影響 - 如果他們再這樣做,那麼代碼根本就不會更快更可靠。

6

not x將是真實的。

編輯:

這是具有實際意義,只要你想檢查一個變量實際上是設置爲一個適當的值。否則,你可能會遇到問題。例如,如果要評估的項目清單,並做到:

if not x: 

可以檢查是否提供了一個列表,則條件將觸發一個空列表,這可能仍然是一個有效的輸入上。因此,在這種情況下,你想與

if x is not None: 

檢查允許使用空列表作爲有效輸入,但還是檢查未提供列表中的所有情況。

這樣的None值與某些語言中的nullnil值相當。它是定義變量中缺少值的佔位符(如果未定義,它將拋出一個NameError)。這就是爲什麼None值作爲在某些情況下,默認值:

>>> def foo(): 
...  pass 
... 
>>> x = foo() 
>>> x is None 
True 

它也經常用來作爲可選變量的默認值:

>>> def foo(bar=None): 
...  if bar is None: 
...   print('No argument passed.') 
...  else: 
...   print('Variable bar: %s' % str(bar)) 
... 
>>> foo(0) 
Variable bar: 0 
>>> foo() 
No argument passed. 

這樣,0仍然是一個有效的值如果使用if not bar:進行檢查,則評估爲False

+0

措辭nitpick:如果變量沒有定義,「if x is not None」仍然是'NameError',就像'if not x'。(你可能想描述某種類型的default- to -'None'上下文,以便於以不會誤導的簡單方式來解釋此問題?) – abarnert 2013-03-27 05:38:01

+0

謝謝,編輯了答案。 – 2013-03-27 05:55:45

1

它們是不同的。 not檢查bool(var)是否評估爲False

例如。

>>> not '' 
True 
>>> not 'abc' 
False 
>>> not 0 
True 

if x is None檢查x是否爲None本身。

3

official PEP 8 recommendation是與身份檢查,以測試

if Variable is not None: 
    print "Hello world" 

的平等/不平等的測試也將工作,但會更慢和不地道:

if Variable != None: 
    print "Hello world" 

測試變量的布爾值產生不同的結果。下面的測試將打印的「Hello World」如果變量是一個空的容器或數等於零:

# Hello world won't print for any of these values: 
for Variable in(), '', u'', {}, [], 0, 0.0, 0j, None: 
    if Variable: 
     print "Hello world"