小能豆

Python 优先级

py

使用以下代码

import sys
print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "."

当我运行的时候

  • python hello.py,我明白了Joe.——Hello丢失了。
  • python hello.py Nick,我明白了Hello Nick——最后的句号“。”不见了。

但是,当我更改代码以用 覆盖三元运算时(),它就可以正常工作。

import sys
print "Hello " + (sys.argv[1] if len(sys.argv) > 1 else "Joe") + "."

当我运行的时候

  • python hello.py,我得到Hello Joe.
  • python hello.py Nick,我得到Hello Nick.

有人能解释一下为什么当我不用括号覆盖三元运算符时会出现不同的行为吗?


阅读 46

收藏
2024-11-22

共1个答案

小能豆

发生这种不同行为的原因是运算符优先级。在没有括号的情况下,Python 会按照默认的运算符优先级来解析代码,导致逻辑与你的预期不同。

无括号的代码

import sys
print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "."

在这里,Python 根据运算符的优先级解析这段代码。三元操作符 (<expr1> if <condition> else <expr2>) 的优先级低于加号操作符 (+)。因此,上述代码等同于:

print ("Hello " + sys.argv[1]) if len(sys.argv) > 1 else ("Joe" + ".")

分析:

  1. 当运行 python hello.py 时:
  2. len(sys.argv) == 1,因此条件 len(sys.argv) > 1False
  3. Python 只执行 else 分支,即 ("Joe" + "."),结果是 "Joe."
  4. 输出为:Joe.

  5. 当运行 python hello.py Nick 时:

  6. len(sys.argv) > 1,因此条件为 True
  7. Python 执行 if 分支,即 ("Hello " + sys.argv[1]),结果是 "Hello Nick"
  8. 句号 "."else 分支的一部分,因此没有包含在输出中。
  9. 输出为:Hello Nick

带括号的代码

import sys
print "Hello " + (sys.argv[1] if len(sys.argv) > 1 else "Joe") + "."

在这里,括号强制改变了运算顺序,使三元操作符先被执行。现在代码等同于:

print "Hello " + (<结果>) + "."

分析:

  1. 当运行 python hello.py 时:
  2. len(sys.argv) == 1,条件 len(sys.argv) > 1False
  3. 三元操作符返回 "Joe"
  4. 最终表达式是:"Hello " + "Joe" + ".",结果是 "Hello Joe."
  5. 输出为:Hello Joe.

  6. 当运行 python hello.py Nick 时:

  7. len(sys.argv) > 1,条件为 True
  8. 三元操作符返回 "Nick"
  9. 最终表达式是:"Hello " + "Nick" + ".",结果是 "Hello Nick."
  10. 输出为:Hello Nick.

关键点总结

  1. 三元操作符的优先级低于加号操作符
  2. 如果没有括号,+ 操作符会优先和最近的部分结合。

  3. 括号改变了默认运算顺序

  4. 使用括号明确告诉 Python 先执行三元操作符,然后再进行字符串拼接。

运算符优先级参考

Python 中,以下是相关运算符的优先级(从高到低):
1. + (加号操作符/字符串拼接):比三元操作符优先级高。
2. <expr1> if <condition> else <expr2> (三元操作符):优先级较低。

当涉及复杂的表达式时,建议使用括号来明确运算顺序,从而避免意外的结果。

2024-11-22