2012-04-11 171 views
0

我對python有一點懷疑。如果Python中的語句

x = '' 
if x: 
    print 'y' 

所以,它永遠不會打印爲 'Y'

如果我這樣做:

x = 0 
if x: 
    print 'y' 

然後也將這樣做。

那麼如果我有'值和0值如何區分如果我只需要考慮0值?

+0

如果你正在評估對0再做如果x == 0 – 2012-04-11 07:31:58

+0

沒有它的不僅僅是0.可能會有一些整數更多的值。我只想過濾''值。 – sam 2012-04-11 07:33:00

+0

如果它不僅僅針對0,那麼可能使用switch case語句或if if elseif類型語句,如果它們只有少數幾個可以滿足基本情況? – 2012-04-11 07:45:38

回答

4

這是因爲目標函數__nonzero__()__len__()將被用來評估條件。 From the docs

object.__nonzero__(self)

調用,實現真值測試和內置操作bool();應返回FalseTrue或其整數等效值0或1.如果未定義此方法,則調用__len__()(如果已定義),並且如果該對象的結果非零,則認爲該對象爲真。如果一個類既沒有定義__len__()也沒有定義__nonzero__(),它的所有實例都被認爲是真實的。

通過重載這些,您可以用來爲自定義類指定這樣的行爲。

至於如果條件下,可以確切地要檢查什麼規定:

if x: # evaluate boolean value implicitly 
    pass 
if x is 0: # compare object identity, see also id() function 
    pass 
if x == 0: # compare the object value 
    pass 

至於隱含布爾評估你的特殊情況:int對象被認爲True如果他們是非零; str如果物體長度不爲零,則認爲物體爲True

2
if x != '': 
    print 'y' 

僅工作如果x不是''

3

的Python爲評估爲假的狀態的空迭代(這裏字符串)。

如果需要檢查,如果值是0明確你不得不說x==0

0

我不是你真正想要什麼明確的 - 你的問題的措辭有點混亂 - 但這可能有所啓發:

>>> test_values = [0,0.00,False,'',None, 1, 1.00, True, 'Foo'] 
>>> for v in test_values: 
    if (not v) and (v != ''): 
     print "Got a logically false value, %s, which was not the empty string ''" % v.__repr__() 


Got a logically false value, 0, which was not the empty string '' 
Got a logically false value, 0.0, which was not the empty string '' 
Got a logically false value, False, which was not the empty string '' 
Got a logically false value, None, which was not the empty string ''