这行在python中的计算结果为True
False in [0,1,2]
Run Code Online (Sandbox Code Playgroud)
因为False和0有强制类型转换后相等.有没有办法避免这种类型转换?像===运营商那样的东西?
(我知道我可以通过显式检查值类型来循环处理这种情况,但我很好奇是否有一些简短而甜蜜的技巧可以在没有循环的情况下执行此操作).
Mar*_*ers 10
首先,Python中没有类型转换.False == 0是真的因为bool是它的子类int,并且这两个对象确实是相等的.
不,没有===运算符,如果您不希望这种情况发生,则需要明确测试类型:
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
Run Code Online (Sandbox Code Playgroud)
这明确断言两个对象是完全相同的类型,不允许子类.
是的,这是一个循环.但是in对于列表也使用循环,仅在内部,并且in包含检查和any() 短路,它们True在找到第一个匹配时立即返回.
请注意,这也不允许float平等.0.0 == 0也是如此,但通过测试确切类型,您也不允许这样做.复杂数字也是如此,并且Decimal():
>>> 0j == 0 == 0.0 == Decimal('0')
True
Run Code Online (Sandbox Code Playgroud)
bool 这里只是另一种数字类型,尽管只限于数值0和1.
未来更好的方法是在代码中使用类型提示 ; 类型提示检查器会捕获像您一样使用布尔值的问题,其中整数或数字是预期的.
如果您真的觉得需要这样做,您可以如下.
False in filter(lambda x: isinstance(x, bool), [0, 1, 2])
Run Code Online (Sandbox Code Playgroud)
或者@JonClements建议
any(x is False for x in [0, 1, 3]) # Since immutable values (including
# boolean) are instantiated only once.
Run Code Online (Sandbox Code Playgroud)
但是,这种用例很少出现在需要区分0和False的地方,因为两者都falsy与Python有关.也许,你需要重新思考你的用例.