使用以下代码
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") + "."
Hello Joe.
Hello Nick.
有人能解释一下为什么当我不用括号覆盖三元运算符时会出现不同的行为吗?
发生这种不同行为的原因是运算符优先级。在没有括号的情况下,Python 会按照默认的运算符优先级来解析代码,导致逻辑与你的预期不同。
在这里,Python 根据运算符的优先级解析这段代码。三元操作符 (<expr1> if <condition> else <expr2>) 的优先级低于加号操作符 (+)。因此,上述代码等同于:
<expr1> if <condition> else <expr2>
+
print ("Hello " + sys.argv[1]) if len(sys.argv) > 1 else ("Joe" + ".")
len(sys.argv) == 1
len(sys.argv) > 1
False
else
("Joe" + ".")
"Joe."
输出为:Joe.
当运行 python hello.py Nick 时:
True
if
("Hello " + sys.argv[1])
"Hello Nick"
"."
在这里,括号强制改变了运算顺序,使三元操作符先被执行。现在代码等同于:
print "Hello " + (<结果>) + "."
"Joe"
"Hello " + "Joe" + "."
"Hello Joe."
输出为:Hello Joe.
"Nick"
"Hello " + "Nick" + "."
"Hello Nick."
如果没有括号,+ 操作符会优先和最近的部分结合。
括号改变了默认运算顺序。
Python 中,以下是相关运算符的优先级(从高到低): 1. + (加号操作符/字符串拼接):比三元操作符优先级高。 2. <expr1> if <condition> else <expr2> (三元操作符):优先级较低。
当涉及复杂的表达式时,建议使用括号来明确运算顺序,从而避免意外的结果。