【问题标题】:What does 'is' operator do in Python?'is' 运算符在 Python 中的作用是什么?
【发布时间】:2013-08-18 23:54:09
【问题描述】:

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

【问题讨论】:

  • 是的,val is not Nonenot (val is None)equivalent。但第一个在 IMO 上更具可读性。

标签: python operators


【解决方案1】:

你错过了is not 也是一个运算符

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

>>> not None
True

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

>>> bool(None)
False

所以not None 是布尔值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

【讨论】:

  • 重要的是要提到is not 是一个单一的运算符。 True is (not 1) -> FalseTrue is not 1 -> True。所以not None 返回的内容无关紧要。
  • @PavelAnossov not None 的返回值是相关的,因为 OP 在一个示例中使用了 (not None)
  • @delnan:完全正确,因为显然 OP 忽略了 is not 是单个运算符。看起来op1 is (not None) 是意料之中的。应该是False,而不是True
  • “运算符 isis not 测试对象身份:x is y 当且仅当 x 和 y 是同一个对象时为真。x is not y 产生逆真值。” docs.python.org/release/2.7/reference/expressions.html#notin
【解决方案2】:

作为 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

【讨论】:

  • 对于None 我同意,对于FalseTrue 这可能是一个实现细节。尽管如此,测试if xxx is True: 对我来说听起来很傻。仅仅是if xxx: 应该会更好。
  • @glglgl 我同意。我刚刚在讨论中介绍了TrueFalse 作为提到is (not None) 的原始问题。也就是说,使用is 运算符与布尔值(not None) 进行比较——这与其他cmets 中解释的使用is not 运算符不同。
  • @glglgl 你可以很容易地想出一个xxx is True 的病态案例:返回错误代码,以linux进程的方式。如果函数成功,则返回 True,如果失败,则返回错误代码,该代码可能大于 0,因此也将评估为 true。诚然,有更好的方法可以做到这一点,但我们在这里是病态的。 (诚​​然,对于读者而言,上述内容比使用 linux-esque zero-for-success 所需的 if !result: 更有意义。)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2015-05-28
    相关资源
    最近更新 更多