7

我(也许是错误地)认为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

那么,'is' 操作符是做什么的呢?只是我猜想的对象ID比较吗?如果是这样,val is not None在 Python 中被解释为not (val is None)?

4

3 回答 3

10

你也错过了那is not是一个运营商。

没有is,常规not运算符返回一个布尔值:

>>> not None
True

not None因此是 的逆布尔“值” None。在布尔上下文中None为假:

>>> bool(None)
False

not Noneboolean 也是如此True

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

>>> 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
于 2013-08-16T14:26:28.833 回答
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
于 2013-08-16T14:30:46.363 回答
0

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

>>> val is not None
True

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

但是,从逻辑和句法的角度来看,您已经逐字逐句地分解了语句并假设它是:

>>> val is (not None)
False

当包含在适当的专利中时,它会返回您的预期结果 ( False)。

正如@Martijn Pieters 指出的那样,is not 它本身就是一个运营商,并且它是唯一在这里工作的运营商。

如果您想将其编写为仅使用不包含空格的运算符的明确语句,您可以编写:

>>> not (val is None)
True

但这不是您用英语“说出”预期语句的方式,或者甚至可能用伪代码编写它。

于 2013-08-16T15:11:33.587 回答