【问题标题】:What is the purpose of the '==' operator when comparing values vs '='?在比较值与“=”时,“==”运算符的目的是什么?
【发布时间】:2013-03-24 13:36:07
【问题描述】:

首先,请注意,我知道== 用于比较两个表达式,而= 用于为变量赋值。然而,python 是一种语法要求极低的简洁语言,这似乎是一个容易被砍掉的运算符。此外,我并不是要开始辩论或讨论,而是要了解我是否缺少某些东西来提高我的编程知识。

就像(在 python 中)我们不需要声明一个变量是一个 int 或一个字符串,并且语言根据分配的值来确定这一点,为什么 'if' 语句不简单地确定 = 是一个比较,而不是一个赋值?
另一个例子是python去掉了其他语言中的很多{}和[],只使用了缩进,因为缩进和使用大括号是多余的。在我看来,if foo == goo: 也是多余的。但也许有些事情我还没有意识到。所以问题来了!

【问题讨论】:

  • 这很有趣,因为我刚刚看过这个视频:Interview with Tim Peters,他说他开始使用 Python 0.9.1,= 符号实际上用于比较和赋值
  • 现在我需要看那个......我不知道情况会如此。当然,当我开始使用 python 时,我们是在 python2.6 ......从那时起并没有改变很多(python3.something 已经出来了......)

标签: python


【解决方案1】:

一个非常简单的原因是python允许布尔表达式:

a = b == c

还有多重赋值:

a = b = c

在第一种情况下,a 被分配一个布尔值*(TrueFalse),具体取决于 bc 是否相等。在第二种情况下,ab 最终引用了同一个对象 (c)。显然你不能只用一个操作符来支持两者。

我想你可以(原则上)仅在 if 语句中重载 =(因为那里不允许赋值),但这会让人感到困惑——尤其是对于来自 C 的人来说,@987654321 @禅又赢了(“显胜过隐”)。


  • 它实际上不必是布尔值。它实际上是a__eq__ 方法返回的任何内容(或者b__eq__ 如果前者返回NotImplemented)——大多数 对象返回一个布尔值,但是少数不这样做(numpy.ndarray 是一个常见的对象,它有一个 __eq__,它返回另一个 ndarray

【讨论】:

  • 从这个意义上说,包含b == c 的一行将构成一个完整的语句,并且肯定与b = c 不同。 +1
  • 谢谢。说得通。我同意,您不想仅针对 if 语句更改它。这将违背保持 python 一致的总体原则。
  • @heltonbiker -- 这是一个完全正确的观点,尤其是在交互式提示中,b == cprint repr(b == c) 相同。当然,我们不要忘记,由于 python 的动态特性,在运行时很难知道bc 是什么。其中一个可能有一个非常时髦的__eq__,带有副作用或诸如此类的东西,因此即使您不在交互式提示符下,表达式b == c(原则上)也可能是“有用的”。
【解决方案2】:

这两个运算符可以重叠。例如,考虑

a = b = c

ab 都设置为c,并且

a = b == c

根据bc 是否相等,将a 设置为TrueFalse


更一般地说,Python 会尝试避免甚至可能模棱两可的语法,以使解析器更简单。即使可以解决上述歧义,也将涉及添加许多特殊情况,并且通常会增加解析器的复杂性。将这两个运算符巧妙地分开可以避免这个问题。

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 2012-10-19
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多