2017-04-18 91 views
5

我想知道,如果有人可以解釋爲什麼這兩個例子中最終產生相同的結果:蟒蛇類的默認參數

class Myclass(): 

def __init__ (self, parameter=None) 

    if parameter is None: 
     self.parameter = 1.0 
    else: 
     self.parameter = parameter 

和:

class Myclass(): 

def __init__ (self, parameter=None) 

    if parameter: 
     self.parameter = parameter 
    else: 
     self.parameter = 1.0 

我直觀地瞭解第一個「如果......是無「,但我與第二個例子鬥爭。都可以使用?

我意識到這可能是一個相當簡單的問題,因此如果任何人都可以指導我讀任何有助於理解差異的讀物。

謝謝!

+7

他們並不總是返回相同的結果。試着發送參數= 0來看看。 – wim

+0

'None'是* falsy *,所以當使用默認值時,else分支在第二種情況下被採用。但是,也有例外。 –

+0

看看[真值測試](https://docs.python.org/3/library/stdtypes.html#truth-value-testing) –

回答

2

他們是不等價的,在第一個代碼段,parameter爲1.0 當且僅當parameterNone,但在第二個,parameter將1.0任何falsy value。以下值全部falsy在Python:

  • 任何數值類型的零,例如,0,0L,0.0,0j的。

  • 任何空序列,例如'',(),[]。

  • 任何空映射,例如{}。一個非零()用戶定義的類的

  • 情況下,如果類定義或len個()方法中,當該方法返回整數零或布爾值假。

所以第一個代碼片段更嚴格。官方的文檔,請參考:

+0

這是有道理的,謝謝你的回答和鏈接! – Ale

1

在第一個示例中,僅當parameter字面上爲None時,條件纔會成立。

在第二個例子中,條件只對真值有效。

顯示這將是一個簡單的方法:

def meth1 (parameter): 
    return parameter is None 

def meth2 (parameter): 
    return not(bool(parameter)) 

print([(meth1(v), meth2(v)) for v in [False, None, 0]]) 

> [(False, True), (True, True), (False, True)] 
+0

你能證明一個簡單的例子嗎? – matusko

+0

我在雨中外面,水在弄亂我的觸摸屏,所以任何打字都很難。我也誤解了這個問題。現在更新。 – Carcigenicate