2016-04-23 90 views
1

任何人都可以解释为什么:具体的Python的的if/else一个衬垫参数替换

>>> print 1,2 if 0 else 3,4 
1 3 4 

但:

>>> print(1,2) if 0 else 3,4 
3 4 

也许这不是在所有这种情况下连接?

+8

因为第一是'打印1,(2如果0,否则,3),4'和第二是'print((1,2)if 0 else 3),4' - 参见https://docs.python.org/2/reference/expressions.html#operator-precedence和https://docs.python.org /2/library/stdtypes.html#truth-value-testing。目前尚不清楚哪一部分令人惊讶。 – jonrsharpe

+1

这就是为什么你应该使用括号打印的原因。为了避免这种混淆。 –

回答

0

引用docs

打印评估依次在每个表达,将所得 对象写入标准输出。

所以我们只需要弄清楚这些表达式就是你的情况。

print 1,2 if 0 else 3,4相当于print 1, (2 if 0 else 3), 4。打印语句接收三个“参数”,第一个和第三个是常量表达式,第二个包含三元语句。

print(1,2) if 0 else 3,4相当于打印(1,2) if 0 else 3, 4。打印语句接收两个“参数”,第一个包含三元语句,第二个是常量表达式。

1

你的第一个例子给出了三个项目print其用逗号隔开:

1 
2 if 0 else 3 
4 

你可以把在不同的地方括号,并得到相同的结果:

print 1, (2 if 0 else 3), 4 

如果你想有元组行为,可以在那里使用圆括号:

print (1, 2) if 0 else (3, 4) 

这个问题当然是打印成一个元组而不是单独的参数。确实,最好的办法是要么使用from __future__ import print_function和使用print(*((1, 2) if 0 else (3, 4)))或有一个整体的if - else块:

if 0: 
    print 1, 2 
else: 
    print 3, 4 
相关问题