Python 3 中 print 必须是函数调用,不加括号会触发 SyntaxError;它从 Python 2 的语句重构为内置函数,支持参数化控制(如 end、sep、file、flush),行为更统一但迁移时易因隐式逻辑失效。

print 在 Python 3 中必须是函数调用,不加括号会直接触发 SyntaxError,解释器根本无法启动——这不是运行时警告,而是语法解析阶段就失败。
为什么 print "hello" 在 Python 3 里报错?
Python 2 的 print 是语句(类似 if 或 for),而 Python 3 把它彻底重构为内置函数。语句不能出现在表达式上下文,函数可以;语句无法被重定义、传参或装饰,函数可以。
- 最直接的表现:
print "x"→ 解析失败,报SyntaxError: invalid syntax -
print "x", "y"不是“两个参数”,而是语句后跟两个表达式,靠空格隐式连接;Python 3 中print("x", "y")才是明确传入两个对象 - 旧写法
print >> f, "msg"在 Python 3 里不是语法错误就是语义错误:前者变成print("msg", file=f),后者如果f没实现write()方法,会抛AttributeError
print() 的参数行为和 Python 2 完全不同
Python 2 中靠标点符号控制行为(逗号抑制换行、>> 重定向),Python 3 全部收归为显式参数,逻辑更统一但也更易漏配。
- 不换行不再是
print "x",,而是print("x", end="");漏掉end=""就多一行,可能破坏日志对齐或终端动画节奏 - 分隔符默认是空格,但可改:
print("a", "b", sep="|")→a|b;Python 2 没这个能力 -
flush=True是 3.3+ 新增参数,用于强制刷缓冲区(比如实时输出进度条),Python 2 无对应机制
批量迁移时最常踩的坑不是语法,而是副作用假设
很多旧代码依赖 print 的语句特性做隐式控制,迁移到函数后表面能跑,实际行为已变。
-
print x,(Python 2)→ 同行输出;等效的 Python 3 写法是print(x, end=""),写成print(x)就多出换行 - 用
print控制终端光标位置(如覆盖上一行)时,漏掉end=""或没配flush=True,会导致刷新延迟、显示错乱 - 重定向到自定义类(非
io.TextIOWrapper)时,Python 2 只要求有write方法,Python 3 还要求支持flush和encoding属性,否则运行时报错


















