2012-04-20 51 views
2

我這裏有一些代碼:Python的無,如果條件

m = None 
n = None 

if not m: 
    print "Something happens" 
>>> Something happens 

如果我這樣做:

if not m and n: 
    print "Something happens" 

什麼也沒有發生。

但我可以做的:

m, n = 1,2 
if m and n: 
    print "Something happens" 
>>> Something happens 

爲什麼是如果,如果沒有相同的方式處理? '如果不',不採取'和'陳述?

謝謝

+0

優先級較低我看到的地方,這是一個很好的做法,與使用身份的無比較。例如:'如果m是None並且n不是None:'。 – Fenikso 2012-04-20 09:12:11

回答

11

你有一個operator precedence問題。

if not m and n相當於if (not m) and n。你想要的是if not m and not nif not (m or n)

參見:適用於它的壁櫥操作De Morgan's Laws

+0

謝謝,真的很簡單 – Neeran 2012-04-20 09:00:53

+1

如有疑問,加上括號。我有時想知道,如果語言要求您在任何可能存在問題的情況下使用顯式分組,那麼會節省多少時間。你會花費幾秒鐘輸入extra(),但是如果第一次避免混淆這樣的東西,你會節省更多。那麼你會浪費兩倍的時間坐在這個蠢蠢的語言中嘲諷所有()的水冷卻器...... – 2012-04-20 09:02:43

+0

@BillK你基本上描述了它在lisp中的工作原理。 – 2012-04-20 09:11:12

2

not。你寫了if not m and n其中not適用於m這是True,並且因爲and,n評估爲False,因此整個陳述被評估爲False

1

我認爲你正在尋找的這篇文章:Truth Value Testing

任何對象都可以對真理值進行檢驗,使用if或while條件或以下的布爾運算的操作數。下面的值被認爲是假:

  • 任何數值類型的零,例如,00L0.00j
  • 任何空序列,例如'',(),[]
  • 任何空映射,例如,{}
  • 用戶定義類的實例,如果該類定義了__nonzero__()__len__()方法,則該方法返回整數零或布爾值False。

所有其他值都被認爲是真的 - 因此許多類型的對象總是爲真。 除非另有說明,否則具有布爾結果的操作和內置函數始終返回0False(假),並且1True爲真。 (重要的例外:布爾運算或者和總是返回它們的一個操作數。)

尤其是接下來的章節介紹你的情況(Boolean Operations — and, or, not):

不具有比非布爾運算符