Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是';是';Python中的运算符是什么?_Python_Operators - Fatal编程技术网

什么是';是';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
返回的内容是不相关的。@PavelAnossov
not 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