101

在 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 中,括号 onprint是强制性的,本质上使它成为一个函数,但在 2.7 中,两者都会产生不同的结果。print在 Python 2.7 中我还应该了解什么?

4

4 回答 4

110

在 Python 2.xprint中实际上是一个特殊的语句而不是一个函数*。

这也是它不能像这样使用的原因:lambda x: print x

请注意,(expr)它不会创建元组(它会导致expr),但,会。print (x)这可能会导致 Python 2.7和print (x, y)Python 2.7之间的混淆

(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.xprint中的一种特殊语法语句/语法结构,,因此在没有括号的情况下,它会以特殊方式处理 's - 并且不会创建元组。对语句的这种特殊处理print使其能够在是否有尾随时采取不同的行动,

快乐编码。


* printPython 2 中的这种行为可以更改为 Python 3 中的行为:

from __future__ import print_function
于 2011-05-31T04:25:02.863 回答
5

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

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

print expr1, expr2, ... exprn

(依次评估每个表达式,将其转换为字符串并在它们之间用空格显示。)

但请记住,在表达式周围加上括号仍然是相同的表达式。

所以你也可以这样写:

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

这与调用函数无关。

于 2011-05-31T05:33:24.040 回答
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')

最后一个打印是具有十六进制字节值的元组。

于 2012-08-15T17:05:50.260 回答
2

基本上在 Python 3 之前的 Python 中,print 是一个特殊的语句,如果作为参数得到,它会打印所有的字符串。所以print "foo","bar"简单的意思是“打印'foo'后跟'bar'”。这样做的问题是,将 print 视为一个函数是很有诱惑力的,而 Python 语法在这方面是模棱两可的,因为(a,b)它是一个包含aand bbutfoo(a,b)是对两个参数的函数的调用。

因此,他们对 3 进行了不兼容的更改,以使程序不那么模棱两可,更规则。

(实际上,我认为 2.7 的行为与 2.6 一样,但我不确定。)

于 2011-05-31T04:28:42.770 回答