【问题标题】:Consecutive 'is' operator in Python [duplicate]Python中的连续'is'运算符[重复]
【发布时间】:2017-10-14 05:32:15
【问题描述】:

谁能帮我解释一下?

>>> None is None is None
True
>>> (None is None) is None
False

'is' 运算符不是取 2 个操作数,从左边开始比较对象,然后返回布尔值吗?

【问题讨论】:

  • 不完全是重复的,另一个问题暗示知道链式表达式功能并询问它是否适用于is
  • @FerdinandBeyer mm,如果你想重新打开它,我留给你。当另一个问题真正询问他们所看到的无法解释的行为时,人们经常会欺骗著名的Least Astonishment” and the Mutable Default Argument。不过,我敢打赌还有其他潜在的重复。
  • 感谢您告诉我。我承认这是重复的,但我真的找不到那些文章或参考资料,所以我不得不问。
  • @juanpa.arrivillaga 我很好
  • @vbstb:不用担心,不知道“链式表达式”这个词,很难找到对这个特性的引用。

标签: python python-3.x


【解决方案1】:

因为它被解释为chained comparison

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "!="
                   | "is" ["not"] | ["not"] "in"

比较可以任意链接,例如,x &lt; y &lt;= z 是等价的 到x &lt; y and y &lt;= z,除了 y 只被评估一次(但在这两个 当发现x &lt; y 为假时,根本不评估案例z。

形式上,如果a, b, c, …, y, z 是表达式,op1, op2, …, opN 是 比较运算符,则a op1 b op2 c ... y opN z 等价于 a op1 b and b op2 c and ... y opN z,除了每个表达式都是 最多评估一次。

因此,由于is 是一个比较运算符,您的第一个表达式相当于:

None is None and None is None

【讨论】:

  • 这是如何被否决的?
  • @MadPhysicist 可能是因为它是重复的。我可能应该知道。
  • 这是否意味着None is not 5 &lt; 10 也将是True,因为如果可以混合比较运算符?
  • @MadPhysicist 是的
【解决方案2】:

2 &lt; 3 &lt; 4比较。

第二个无与第一个无相同吗?是的。 3号和2号一样吗?是的。

OTOH,(True) is None 显然是错误的。括号打破了链接。

评估lo &lt; n &lt; hi 是一个常见的python 习惯用法,这不会让您担心True &lt; 4 的中间结果。评估x is y is z 不太常见,但对于您的单身None,这三个对象是相同的。

【讨论】:

  • 这并不能解释什么。为什么会这样?仅仅因为其他一些不相关的操作员有类似的行为?
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多