在列表python中与0错误匹配

2024-04-23 11:13:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这一行在python中的计算结果为True

False in [0,1,2]

因为False和{}在类型转换后是相等的。 有什么办法可以避免这种排版吗? 类似于列表的===运算符?在

(我知道我可以通过显式检查值类型来使用循环来处理这种情况,但是我很好奇,如果没有循环,是否有一些简单而巧妙的技巧来实现这一点)。在


Tags: infalsetrue类型列表技巧情况运算符
3条回答

首先,在Python中没有类型转换。False == 0是真的,因为boolint的子类,两个对象实际上是相等的。在

不,没有===运算符,如果不希望发生这种情况,则需要显式测试类型:

lst = [....]
testvalue = False
if any(testvalue == elem and type(testvalue) is type(elem) for elem in lst):
    # lst contains testvalue and it is the same type

这明确声明这两个对象是完全相同的类型,不允许使用子类。在

是的,这是一个循环。但是列表的in也只在内部使用一个循环,in包含检查和{}短路,一旦找到第一个匹配项,它们就会返回True。在

注意,这将不允许float相等。0.0 == 0也是正确的,但是通过测试确切的类型,您也不允许这样做。复数也是如此,Decimal()

^{pr2}$

bool只是这里的另一个数字类型,尽管它仅限于数值0和1。在

接下来,更好的方法是在代码中使用type hinting;类型提示检查器将捕捉到像使用布尔值(需要整数或数字)这样的问题。在

如果你真的觉得有必要这样做,你可以做如下。在

False in filter(lambda x: isinstance(x, bool), [0, 1, 2])

或者像JonClements建议的那样

^{pr2}$

但是,这种用例很少出现在需要区分0和False的情况下,因为就Python而言,两者都是falsy。也许,你需要重新考虑你的用例。在

你可以使用“is”关键字。在

>>> False == 0
True
>>> False is 0
False

相关问题 更多 >