什么是';是';Python中的运算符是什么?
我(可能是错误地)认为什么是';是';Python中的运算符是什么?,python,operators,Python,Operators,我(可能是错误地)认为is操作符正在进行id()比较 >>> x = 10 >>> y = 10 >>> id(x) 1815480092 >>> id(y) 1815480092 >>> x is y True 然而,对于val不是None,它似乎不是那么简单 >>> id(not None) 2001680 >>> id(None) 2053536 >>
is
操作符正在进行id()比较
>>> x = 10
>>> y = 10
>>> id(x)
1815480092
>>> id(y)
1815480092
>>> x is y
True
然而,对于val不是None
,它似乎不是那么简单
>>> id(not None)
2001680
>>> id(None)
2053536
>>> val = 10
>>> id(val)
1815480092
>>> val is not None
True
那么,“is”操作符做什么呢?这只是我猜想的对象id比较吗?如果是这样,
val不是None
在Python中被解释为不是(val是None)
您错过了不是
也是操作员
如果没有is
,则常规not
运算符将返回布尔值:
>>> not None
True
因此,notnone
是None
的反布尔“值”。在布尔上下文中,None
为false:
>>> bool(None)
False
所以notnone
是布尔值True
None
和True
都是对象,都有一个内存地址(Python的CPython实现返回的值id()
):
is
测试两个引用是否指向同一对象;如果某个对象是同一个对象,那么它也将具有相同的id()is
返回一个布尔值,True
或False
is not
是is
运算符的逆运算。在一个操作符中,它相当于not(op1是op2)
。此处不应将其理解为op1是(不是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
作为对Martijn Pieters回答的补充,None
、True
和False
是单例。每个值只有一个实例,因此使用is
测试它们是安全的
>>> id(True)
8851952
>>> id(False)
8851920
>>> id(None)
8559264
>>> id(not None)
8851952
>>> id(1 == 0)
8851920
>>> id(1 == 1)
8851952
Python试图模拟英语语法以使其更易于阅读,但在本例中,运算符优先级有点令人困惑
>>> val is not None
True
在英语中,我们询问val
是否没有与None
相同的对象表示的值。在上面的示例中,val=10
,因此答案是(正确的)True
然而,从逻辑和句法的角度来看,你已经逐字分解了陈述,并假设它是:
>>> val is (not None)
False
当包含在适当的专利论文中时,返回您的预期结果(False
)
正如@Martijn Pieters指出的,不是
,它是这里唯一的操作员
如果希望仅使用不包含空格的运算符将其编写为非歧义语句,则可以编写:
>>> not (val is None)
True
但这不是你用英语“说”预期语句的方式,甚至可能不是用伪代码写的。是的,val不是None
和not(val是None)
是。但第一个更具可读性。重要的是要提到,不是
是单个运算符<代码>真是(不是1)->假
,真不是1->真
。因此,not None
返回的内容是不相关的。@PavelAnossovnot None
的返回值是相关的,因为OP在一个示例中使用了(not None)
。@delnan:没错,因为OP显然遗漏了不是的操作符。看起来应该是op1(而不是None)
。这将是False
,而不是True
“操作符是
和不是
测试对象标识:x是y
当且仅当x和y是同一对象时为真。x不是y
产生相反的真值。”对于无
我同意,对于False
和True
,它可能是一个实现细节。然而,如果xxx是真的,测试:
听起来很傻;如果xxx:
仅仅是,应该会更好。@glglgl我同意。我刚才在讨论中介绍了True
和False
,因为所提到的原始问题是(不是无)
。也就是说,使用is
运算符与布尔值(非无)
——这与使用is not
运算符不同,正如其他注释中所解释的那样。@glglglgl您可以很容易地得出xxx is True
的病理情况:以linux进程的方式返回错误代码。如果函数成功,则返回True;如果函数失败,则返回错误代码,该代码可能大于0,因此也将计算为True。诚然,有更好的方法可以做到这一点,但我们在这里是病态的。(无可否认,对于读者来说,上述内容比所需的if!result:
with linux-esque-zero-for-success更有意义。)
>>> not (val is None)
True