两套类似的python代码似乎行为不同
试图找出为什么我在这里得到两个不同的结果(一个是错误)。这里是运行的代码:两套类似的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'
我不知道我理解为什么一个工程,一个没有。而那个工作的人,我甚至不知道我明白为什么它会这样做。我一直在我的程序中使用第一个代码块一段时间...
在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
。
在第一个示例中if a and b
的计算结果为False,因为bool(None)
为False。在第二个例子中,列表[None]
计算为True,因为它不是空
的问题是主要归功于此:
home_team_ratings = [None]
在第一个版本,当你写
if a and b
b
是None
,因为它出来了home_team_ratings
。所以if
条件是错误的。
在第二个版本
if visitor_team_ratings and home_team_ratings:
这种情况是真实的,因为无论列表是空的。 但是然后(home_team_ratings[0] + float(hta))
会抛出一个异常,因为您试图将None
添加到浮点数。
在第一个块中,您正在循环列表中的元素。在循环内部,您正在评估天气元素(a和b都是)是否为真。显然,无是不是真的,这就是为什么它移动到其他部分。
在第二部分中,您正在评估两个列表是否为真。如果零件被执行,则列表不是空的。
'如果visitor_team_ratings和home_team_ratings:'应该是'如果visitor_team_ratings [0]和home_team_ratings [0]:'否则你不看这个元素,但在列表本身 – Nuageux
我想现在我发布了这个SO,我有点看到问题是什么。在第一个代码块中,我正在测试以查看列表a/b中的元素是否真实。在第二个代码块中,我正在测试以查看列表本身是否真实... – Biggen
我正在写这个答案。请发布一个@Nuageux – e4c5