''是什么?运算符在Python中做什么?

时间:2013-08-16 14:25:18

标签: python operators

我(可能是错误的)认为is运算符正在进行id()比较。

>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True

然而,对于val is not None,似乎并非那么简单。

>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True

然后,'是'运营商做了什么?它只是我推测的对象id比较吗?如果是这样,val is not None在Python中被解释为not (val is None)

3 个答案:

答案 0 :(得分:10)

您错过了is not也是运营商

如果没有is,则常规not运算符会返回布尔值:

>>> not None
True
因此,{p> not NoneNone的反布尔'值'。在布尔上下文中,None为false:

>>> bool(None)
False

所以not None是布尔True

NoneTrue都是对象,并且都有一个内存地址(Python的CPython实现返回值id()):

>>> id(True)
4440103488
>>> id(not None)
4440103488
>>> id(None)
4440184448

is测试两个引用是否指向同一对象;如果某个东西是同一个对象,它也会有相同的id()is返回布尔值TrueFalse

is notis运算符的反函数。它在一个运算符中相当于not (op1 is op2)应该在op1 is (not op2)处读取:

>>> 1 is not None     # is 1 a different object from None?
True
>>> 1 is (not None)   # is 1 the same object as True?
False

答案 1 :(得分:3)

作为 Martijn Pieters 答案的补充,NoneTrueFalse是单身人士。每个值只有一个实例,因此使用is来测试它们是安全的。

>>> id(True)
8851952
>>> id(False)
8851920
>>> id(None)
8559264
>>> id(not None)
8851952
>>> id(1 == 0)
8851920
>>> id(1 == 1)
8851952

答案 2 :(得分:0)

Python尝试模拟英语语法,使其更具人性化,但在这种情况下,运算符优先级有点令人困惑。

>>> val is not None
True

在英语中,我们询问val是否没有由与None相同的对象表示的值。在上面的示例val=10中,答案是(正确)True

然而,从逻辑的,语法的角度来看,你已逐字逐句地分解了这个陈述,并认为它是:

>>> val is (not None)
False

,如果附在适当的专利中,则会返回您的预期结果(False)。

正如@Martijn Pieters指出的那样,is not is an operator in its own right,它是唯一在此工作的运营商。

如果您只想使用不包含空格的运算符将其写为非模糊语句,您可以写:

>>> not (val is None)
True

但这不是你怎么用英语'说'预期的语句,或者甚至可能用伪代码写它。