为什么在Python 2.7中自动打印括号?

在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括号中是强制性的,本质上是一个函数,但是在2.7中,两者都会有不同的结果。 还有什么我应该知道在Python 2.7 print

在Python 2.x print实际上是一个特殊的声明,而不是一个函数*。

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

请注意(expr)不会创build一个元组(它会导致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.] 

但是,由于print是Python 2.x中一个特殊的语法语句/语法结构 ,所以没有括号,它以特殊的方式处理, 并且不会创buildTuple。 print语句的这种特殊处理使其能够以不同的方式行事,如果存在尾随的话。

快乐的编码。


* Python 2中的print行为可以更改为Python 3的print行为:

 from __future__ import print_function 

当谈到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') 

最后一次打印是具有hex字节值的元组。

基本上在Python 3之前的Python中,print是一个特殊的语句,打印所有的string,如果得到的参数。 所以print "foo","bar"只是意味着“打印”foo“后跟”bar“”。 问题在于它很容易就像打印是一个函数一样行事,而且Python语法是不明确的,因为(a,b)是包含ab的元组,但是foo(a,b)是对两个参数的函数。

所以他们做了不相容的变化,使节目更加模糊,更加规范。

(实际上,我认为2.7的performance是2.6,但我不确定)

这一切都很简单,与向前或向后的兼容性无关。

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

 print expr1, expr2, ... exprn 

(依次评估每个expression式,将其转换为一个string,并在它们之间显示一个空格。)

但是请记住,把一个表情放在一边还是一样的表情。

所以你也可以这样写:

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

这与调用函数无关。