在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
还应该了解什么?
答案 0 :(得分:102)
在Python 2.x中print
实际上是一个特殊语句而不是函数*。
这也是为什么它不能像lambda x: print x
请注意,(expr)
不会创建元组(结果为expr
),但,
会创建。{1}}。这可能会导致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中的特殊语法语句/语法构造,因此在没有括号的情况下,它会将,
视为一个特殊的方式 - 而不创建元组。对print
语句的这种特殊处理使其在有,
跟踪时可以采取不同的行为。
快乐的编码。
* Python 2中的print
行为可以更改为Python 3的行为:
from __future__ import print_function
答案 1 :(得分: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')
最后一个打印是带有十六进制字节值的元组。
答案 2 :(得分:3)
这一切都非常简单,与向前或向后兼容无关。
版本3之前的所有Python版本中print
语句的一般形式是:
print expr1, expr2, ... exprn
(依次评估每个表达式,转换为字符串并在它们之间显示空格。)
但请记住,在表达式周围加上括号仍然是相同的表达式。
所以你也可以这样写:
print (expr1), (expr2), ... (expr3)
这与调用函数无关。
答案 3 :(得分:2)
基本上在Python 3之前的Python中,print是一个特殊的语句,如果得到参数,则打印所有字符串。所以print "foo","bar"
只是意味着“打印'foo'后跟'bar'”。这个问题很可能就像print是一个函数一样,并且Python语法在这方面含糊不清,因为(a,b)
是一个包含a
和b
但foo(a,b)
的元组。 1}}是对两个参数的函数的调用。
因此他们对3进行了不兼容的更改,使程序变得模糊不清,更加规则。
(实际上,我认为2.7在这方面表现为2.6,但我不确定。)