2017-06-02 74 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都是)是否为真。显然,无是不是真的,这就是为什么它移动到其他部分。

在第二部分中,您正在评估两个列表是否为真。如果零件被执行,则列表不是空的。