为什么在python3中'2'<'1'== False输出False?

wzf*_* wu 11 python-3.x

'2'<'1'== False #False
('2'<'1')== False #True
'2'<('1'== False) #error
Run Code Online (Sandbox Code Playgroud)

python3中的代码我们知道python3中的运算符优先级 https://docs.python.org/3/reference/expressions.html#operator-precedence

Ars*_*nic 15

在情况 1 :-

'2'<'1'== False
Run Code Online (Sandbox Code Playgroud)

'2'<'1' and '1' == False根据操作符链进行评估{感谢@ymonad 提供此链接}

这将被评估为 False

在情况 2 中:-

('2'<'1')== False
Run Code Online (Sandbox Code Playgroud)

由于()具有更高的优先级,因此将首先进行评估。所以表达式将被简化为False == False将评估为True

在情况 3 中:-

'2'<('1'== False)
Run Code Online (Sandbox Code Playgroud)

首先('1' == False)评估哪个是False但现在操作是'2'<Falsepython中的非法操作


编辑:

在评论区回答@snr 提出的问题

关键问题是为什么 '1'== False 有效而 '2'< bool 无效

这是因为相等比较(== 和 !=)的默认行为是基于对象的身份,并且由于对象False和对象'1'不共享相同的身份,因此结果将是False

而未提供其他比较(<、>、<= 和 >=)的默认行为,因此尝试这样做会引发 TypeError


您可以在OP 提供的文档链接中找到它(在标题值比较下)

  • @Everyone,这一切都始于一个良好的意图,“3 &lt; blah &lt; 4”相当于“3 &lt; blah and blah &lt; 4”,其中“blah”仅评估一次。您可能习惯了类似 C 的语法,但我发现这对于初学者来说更直观。不过,这种语法可能会产生误导:“==”也是一个比较运算符,因此可以与其他比较运算符链接起来,就像OP的示例一样,产生违反直觉的表达式。 (3认同)
  • 答案很好,但到底谁认为将 `a&lt;b==c` 改为 `a&lt;b &amp;&amp; b==c` 是个好主意......这太违反直觉了。 (2认同)
  • @每个人都是如此,这在其他语言(如 C/C++)中不会发生,在这些语言中,我们对比较运算符有不同的优先级。 (2认同)
  • 只是为了(也许?)完整性,“2”&lt;“1”是“False”,“2”&lt;“11”也是“False”。字符串比较实际上并不像许多来源声称的那样进行长度比较。 (2认同)
  • 至关重要的问题是为什么 **'1'== False** 有效,而 **'2'&lt; bool** 无效。这就是为什么我没有简单地回答这个问题。 (2认同)

ppw*_*ter 0

当 python 尝试这样做string < string时,它会变成 ascii 并按字母顺序排序。 https://careerkarma.com/blog/python-compare-strings/

顺便说一下,1个ascii是49,2个ascii是50

第一个案例

'2'<'1'== False #False
Run Code Online (Sandbox Code Playgroud)

它被评估为'2'<'1' and '1' == False False
因为 50 < 49 and 1 == False-> False and False->False

第二种情况

('2'<'1')== False # True
Run Code Online (Sandbox Code Playgroud)

它让 python 首先执行 () 。 (50 < 49) == False-> False == False->True

第三种情况

'2'<('1'== False) #error 
Run Code Online (Sandbox Code Playgroud)

首先('1' == False)评估的是 False 并且您尝试这样做'2'<False。它得到一个错误。

Python 运算符优先级:https://www.mathcs.emory.edu/~valerie/courses/fall10/155/resources/op_precedence.html