【问题标题】:Python evaluation order [duplicate]Python评估顺序[重复]
【发布时间】:2010-03-16 08:07:31
【问题描述】:

这是代码,我不太明白,它是如何工作的。谁能告诉我,这是预期的行为吗?

$ipython

In [1]: 1 in [1] == True
Out[1]: False

In [2]: (1 in [1]) == True
Out[2]: True

In [3]: 1 in ([1] == True)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/dmedvinsky/projects/condo/condo/<ipython console> in <module>()

TypeError: argument of type 'bool' is not iterable

In [4]: from sys import version_info

In [5]: version_info
Out[5]: (2, 6, 4, 'final', 0)

【问题讨论】:

  • -1:这在 Python 文档中得到了完整而简单的介绍。 docs.python.org/reference/expressions.html#summary。这似乎不是一个“问题”;这似乎是对阅读 Python 文档的实际拒绝。
  • 实际上,当我阅读它时,这让我很震惊。这是 Python 比较链,但有一对不寻常的运算符。 S.Lott:不要这么快就谴责问题。 Python 比较链是该语言的一个不寻常的特性,这是链的一个不寻常的应用。

标签: python


【解决方案1】:

这是一个“链接”的例子,它是 Python 中的一个陷阱。这是 Python 的一个(可能是愚蠢的)技巧:

a op b op c

相当于:

(a op b) and (b op c)

对于所有具有相同优先级的运算符。不幸的是,in== 具有相同的优先级,is 和所有比较也是如此。

所以,这是你意想不到的情况:

1 in [1] == True  # -> (1 in [1]) and ([1] == True) -> True and False -> False

有关优先表,请参阅 http://docs.python.org/reference/expressions.html#summary

【讨论】:

  • Chaining 经常用于1 &lt; x &lt; 5 之类的表达式(所以它并不总是很傻),但在这种情况下我也很惊讶。很好的探索查尔斯!
  • 是的,虽然我希望1 &lt; 5 &gt; 2 &lt; 3 in range(4) == [0, 1, 2, 3] 没有链接。
  • 链接很好,不是问题。依赖猜测或错误推断的运算符优先级在任何语言中都是不好的——如果它与普通的 * + 或等括号不同,请使用括号!
  • 没有。如果有什么不寻常的地方,很可能会发生错误,语言应该优化程序员的时间并标记它。
  • 澄清一下,链接只发生在比较运算符上,而不是“所有具有相同优先级的运算符”上。不过,比较运算符确实具有相同的优先级。
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 2019-02-06
  • 2012-12-05
  • 1970-01-01
  • 2015-04-07
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多