为什么"1 in (True, None)"在python中评估True?

  • 本文关键字:True python 评估 None in python
  • 更新时间 :
  • 英文 :


我想测试一个值是True还是None,并认为编写此条件的pythonic方式是val in (True, None)

事实证明,如果val = 1,则计算结果为 True。

我能找到的唯一方法是笨拙的val is True or val is None

1 in (True, None)评估True的更深层次原因是什么?有没有更紧凑的方式来编写上述条件?

Truebool继承自整数并且等于1(但与1不完全相同(。

help(bool)

输出:

class bool(int)
|  bool(x) -> bool
|
|  Returns True when the argument x is true, False otherwise.
|  The builtins True and False are the only two instances of the class bool.
|  The class bool is a subclass of the class int, and cannot be subclassed.
|
|  Method resolution order:
|      bool
|      int
|      object

但是因为True继承自int,我们应该能够用bool做任何事情,就像我们用int一样!

print(5 + True) # > 6
print(17 - False) # > 17
print(15//True) # > 15
print(10/False) # > raises ZeroDivisionError since False "=" 0

然而,要回答您的主要问题,即解释为什么1 in (True, None)的计算结果为True是因为in运算符通过检查equality(使用==(而不是对象标识(使用is(来工作。你发言中的None与此无关;它可以是任何对象,您的语句仍将计算为True.

print(1 == True) # > True
print(1 is True) # > False

True1,但从bool方法中添加了一些额外的绒毛

我认为实现您所追求的pythonic方法是检查对象的身份是否包含在列表中(这是您建议的,但我们可以对其进行一些概括(

id(1) in [id(x) for x in [True, None]] # > False

从本质上讲,这只是in运算符的更强版本。我们可以将其编写为函数:

def stronger_in(val, it):
return id(val) in [id(_) for _ in it]
print(stronger_in(1, (True, None)) # > False

最新更新