为什么在python中“1in(True,None)”的值为True?

2024-06-01 06:54:23 发布

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

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

结果是,如果val = 1这计算结果为真

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

1 in (True, None)计算为True的深层原因是什么?是否有一种更简洁的方式来编写上述条件


Tags: or方法innonetrueis方式原因
1条回答
网友
1楼 · 发布于 2024-06-01 06:54:23

Truebool,它继承自integer,等于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

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

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

True1,但是通过bool方法添加了一些额外的绒毛

我认为实现您所追求的目标的一种python方法是检查对象的标识是否包含在列表中(这是您建议的,但我们可以对其进行一点概括)

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

相关问题 更多 >