使用assert比较浮动列表似乎直接开箱即用 - 有没有人知道幕后发生了什么,例如EPSILON的价值是什么?
作为一名C程序员,这一切都让我感到不安......我原本以为断言可能只是比较指针,但似乎做了一些明智的事情:
a = [1.0,2.0]
b = [1.0,2.0]
c = [1.0,2.01]
d = [1.0, 2.0000000000000001]
assert a==b # ok
assert a==c # no go
assert a==d # ok
Run Code Online (Sandbox Code Playgroud)
比较python中的列表,==一个接一个地比较它的元素.如果要测试它是否是相同的列表,请使用is:
>>> a == b
True
>>> a is b
False
>>> e = a
>>> a is e
True
Run Code Online (Sandbox Code Playgroud)
在您的示例中,a == b因为:
>>> 2.0 == 2.0000000000000001
True
Run Code Online (Sandbox Code Playgroud)
阅读有关浮点算术的更多信息.
也许有点题外话,但是您在问题中没有提供太多背景信息。
在各种可用的单元测试机器(包括unittestPython标准库中的模块)中,您会找到一种TestCase称为的方法assertAlmostEqual(v1, v2, tol),可用于编写有关函数/方法调用的浮点结果的测试。如果您的函数/方法返回一个浮点数列表,那么定义一个新TestCase方法非常容易:
def assertListAlmostEqual(self, list1, list2, tol):
self.assertEqual(len(list1), len(list2))
for a, b in zip(list1, list2):
self.assertAlmostEqual(a, b, tol)
Run Code Online (Sandbox Code Playgroud)
(在测试报告中提供良好的错误消息所需的工作留给读者练习)