为什么在Python 2.7中使用print时括号是可选的?

104 投票
4 回答
95868 浏览
提问于 2025-04-16 18:39

在Python 2.7中,下面这两种写法是一样的

print("Hello, World!") # Prints "Hello, World!"

print "Hello, World!" # Prints "Hello, World!"

但是下面这种写法就不行了

print("Hello,", "World!") # Prints the tuple: ("Hello,", "World!")

print "Hello,", "World!" # Prints the words "Hello, World!"

在Python 3.x中,使用print的时候必须加上括号,这样它就变成了一个函数;而在2.7中,两种写法都可以用,但结果会不同。关于Python 2.7中的print,还有什么我需要知道的呢?


另见: 在Python 2.x中,使用关键字参数end=' '时出现SyntaxError的另一种情况,这也是print处理方式不同的一个例子。

4 个回答

5

在这里,我们遇到了一个有趣的情况,涉及到UTF-8编码。

>> greek = dict( dog="σκύλος", cat="γάτα" )
>> print greek['dog'], greek['cat']
σκύλος γάτα
>> print (greek['dog'], greek['cat'])
('\xcf\x83\xce\xba\xcf\x8d\xce\xbb\xce\xbf\xcf\x82', '\xce\xb3\xce\xac\xcf\x84\xce\xb1')

最后的输出是一个包含十六进制字节值的元组。

5

这其实很简单,跟向前兼容或向后兼容没有关系。

在所有Python 3之前的版本中,print语句的一般写法是:

print expr1, expr2, ... exprn

(这里每个表达式都会被计算,转换成字符串,然后用空格隔开显示出来。)

但是要记住,把表达式放在括号里,表达式本身还是一样的。

所以你也可以这样写:

print (expr1), (expr2), ... (expr3)

这和调用一个函数没有关系。

112

在Python 2.x中,print其实是一个特殊的语句,而不是一个函数。

这也是为什么你不能像这样使用它:lambda x: print x

需要注意的是,(expr)并不会创建一个元组(它的结果就是expr),而,才会创建元组。这可能导致在Python 2.7中,print (x)print (x, y)之间的混淆。

(1)   # 1 -- no tuple Mister!
(1,)  # (1,)
(1,2) # (1, 2)
1,2   # 1 2 -- no tuple and no parenthesis :) [See below for print caveat.]

不过,由于在Python 2.x中,print是一个特殊的语法语句/语法结构,所以在没有括号的情况下,它会以特殊的方式处理,,并且不会创建元组。这种对print语句的特殊处理使得它在有或没有结尾的,时表现得不同。

祝你编码愉快。


*在Python 2中,print的行为可以改变为Python 3中的样子:

from __future__ import print_function

撰写回答