2017-06-02 70 views
1

試圖找出爲什麼我在這裏得到兩個不同的結果(一個是錯誤)。這裏是運行的代碼:兩套類似的python代碼似乎行爲不同

hta = 2.13 
visitor_team_ratings = [21.53] 
home_team_ratings = [None] 
difference = [] 

for a, b in zip(visitor_team_ratings, home_team_ratings): 
    if a and b: 
     difference.append(a - (b + float(hta))) 
    else: 
     difference.append('NO RATING') 
print(difference) 

這打印出「無等級」,但我很難理解爲什麼它這樣做。 None與空列表不同,爲什麼python會下降到else聲明。

以下是引發錯誤的類似代碼。相同的變量/列表如上工作代碼:

if visitor_team_ratings and home_team_ratings: 
    difference.append((visitor_team_ratings[0] - (home_team_ratings[0] + float(hta)))) 
else: 
    difference.append('NO RATING') 
print(difference) 

的錯誤是:TypeError: unsupported operand type(s) for +: 'NoneType' and 'float'

我不知道我理解爲什麼一個工程,一個沒有。而那個工作的人,我甚至不知道我明白爲什麼它會這樣做。我一直在我的程序中使用第一個代碼塊一段時間...

+0

'如果visitor_team_ratings和home_team_ratings:'應該是'如果visitor_team_ratings [0]和home_team_ratings [0]:'否則你不看這個元素,但在列表本身 – Nuageux

+1

我想現在我發佈了這個SO,我有點看到問題是什麼。在第一個代碼塊中,我正在測試以查看列表a/b中的元素是否真實。在第二個代碼塊中,我正在測試以查看列表本身是否真實... – Biggen

+0

我正在寫這個答案。請發佈一個@Nuageux – e4c5

回答

2

if visitor_team_ratings and home_team_ratings:̀你看看列表。

而如果您使用:if visitor_team_ratings[0] and home_team_ratings[0]:。然後你看看列表中的元素。 (對應於a和你的第一個塊的b

編輯我應制訂更多:

home_team_ratings = [None] 

這是你的問題的原因。如果你看看這個元素,它是None,所以條件不會是真的。但是,如果您查看列表,那麼您的if將爲True,因爲這兩個列表都不爲空。但在home_team_ratings[0]:之後會出現錯誤,因爲它是None

+1

只要我發佈到SO,燈'點擊'。這真是太神奇了,只是將其輸入給其他人查看幫助,以便真正看到問題。我會盡快給你答案,以獎勵你在評論中如何張貼第一條。 – Biggen

+0

謝謝@Biggen。當你太過專注於你的代碼時,你有時看不到明顯的。通常我試圖用最小的例子來重現我的問題 - 就像你做的那樣 - 大部分時間都非常有幫助。 – Nuageux

0

在第一個示例中if a and b的計算結果爲False,因爲bool(None)爲False。在第二個例子中,列表[None]計算爲True,因爲它不是空

2

的問題是主要歸功於此:

home_team_ratings = [None] 

在第一個版本,當你寫

if a and b 

bNone,因爲它出來了home_team_ratings。所以if條件是錯誤的。

在第二個版本

if visitor_team_ratings and home_team_ratings: 

這種情況是真實的,因爲無論列表是空的。 但是然後(home_team_ratings[0] + float(hta))會拋出一個異常,因爲您試圖將None添加到浮點數。

0

在第一個塊中,您正在循環列表中的元素。在循環內部,您正在評估天氣元素(a和b都是)是否爲真。顯然,無是不是真的,這就是爲什麼它移動到其他部分。

在第二部分中,您正在評估兩個列表是否爲真。如果零件被執行,則列表不是空的。